2010-02-04 37 views
7

Bạn biết cách một số trình theo dõi lỗi (và phần mềm khác) cho phép bạn thêm các trường tùy chỉnh?Đường ray - Thêm trường tùy chỉnh khi chạy trong ActiveRecord

Thông thường điều này được thực hiện với một cấu trúc dữ liệu mà trông giống như sau:

Items 
---------- 
ID | NAME | ITEM_TYPE_ID 


FieldDefinitions 
--------------------------------------- 
ID | ITEM_TYPE_ID | FIELD_NAME | FIELD_TYPE 

FieldValues 
--------------------------------------- 
ID | FIELD_ID | ITEM_ID | VALUE 

Tôi đang cố gắng tìm ra cách tốt nhất để tiếp cận thiết kế này trong Rails. Sẽ có nhiều mô hình mà tôi muốn cho phép mở rộng các thuộc tính đơn giản.

Khi tôi truy xuất số Item Tôi muốn nó bao gồm giá trị băm của các giá trị trường bổ sung đã được xác định cho mô hình đó.

Trả lời

6

Cái gì đó như ...?

class Item < ActiveRecord::Base 
    has_many :field_values 
    has_many :field_definitions, :through => :field_values 

    def custom_fields_hash 
    cfh = {} 
    self.field_values.each |fv| 
     cfh[fv.field_definition] = fv 
    end 
    cfh 
    end 
end 

class FieldValue < ActiveRecord::Base 
    belongs_to :item 
    belongs_to :field_definition 
end 

class FieldDefinition < ActiveRecord::Base 
    has_many :field_values 
    has_many :items, :through => field_values 
end 

Hoặc, bạn có thể thay đổi

cfh[fv.field_definition] = fv 

... để ...

cfh[fv.field_definition.field_name] = fv.value 
+1

Sử dụng bơm có thể là hình thức tốt hơn. Giống như self.field_values.inject ({}) {| memo, fv | memo [fv.field_definition] = fv} hoặc tương tự. –

+0

Đây là những gì tôi đã suy nghĩ tôi muốn sử dụng ... đã tự hỏi nếu có một "ruby" cách để làm điều này ... –

+0

Cách thông thường có lẽ sẽ không sử dụng một băm ở tất cả và chỉ sử dụng liên kết được tạo ra phương pháp, nhưng tôi đoán có một lý do tại sao bạn đặc biệt muốn có một băm ...? –

1

Hãy nhìn vào các Friendly ORM. Nó cho phép bạn làm việc với mysql mà không cần lược đồ. Nó được lấy cảm hứng từ điều này blog post về cách Friendfeed sử dụng mysql để lưu trữ dữ liệu schemaless.

Thân thiện sẽ thay thế ActiveRecord, mặc dù bạn có thể sử dụng mô hình ActiveRecord bên cạnh Mô hình thân thiện khá dễ dàng.

+0

Không chính xác những gì tôi đang tìm kiếm, nhưng một tìm thấy mát mẻ dù sao. +1 –

+0

Nếu bạn xem xét dữ liệu lược đồ ít hơn, bạn có thể muốn xem xét sử dụng cơ sở dữ liệu tài liệu như CouchDB hoặc MongoDB (xem http://railscasts.com/episodes/194-mongodb-and-mongomapper để có một webcast về cách sử dụng MongoDB và đá quý MongoMapper trong một ứng dụng đường ray; Ryan Bates là btw tuyệt vời). –

+0

Vâng, tôi chắc chắn quan tâm đến điều đó. Tôi đang ở trên Heroku, hiện không hoạt động với MongoDB. –

1

Nếu mục đích của bạn là để có FieldDefinition hồ sơ của bạn thuộc mô hình khác nhau (ví dụ, một cột item_id trỏ đến hoặc là một SqueekyToyItem hoặc một BalloonItem) sau đó những gì bạn muốn là một hiệp hội đa hình.

Về cơ bản, nó cho phép bạn có cột item_type (bên cạnh cột item_id), sau đó chỉ định loại mục thực tế mà nó trỏ đến.

Có tiêu đề “Liên kết đa hình” trong tài liệu cho ActiveRecord::Associations::ClassMethods.

+0

Tôi dự định có chúng trên nhiều mô hình, nhưng tất cả chúng sẽ được thừa kế từ Item (hoặc bất kỳ lớp cơ sở của tôi kết thúc) –

Các vấn đề liên quan