2010-02-04 18 views
7

Wiesz, że niektóre narzędzia do śledzenia błędów (i inne oprogramowanie) umożliwiają dodawanie pól niestandardowych?Szyny - Dodawanie pól niestandardowych w czasie wykonywania w ActiveRecord

Zazwyczaj odbywa się to ze struktury danych, który wygląda mniej więcej tak:

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


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

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

Próbuję dowiedzieć się najlepszym sposobem podejścia ten projekt w Rails. Będzie wiele modeli, które chcę umożliwić rozszerzanie prostych właściwości.

Kiedy otrzymam numer Item, chciałbym dodać skrót wartości pól dodatkowych, które zostały zdefiniowane dla tego modelu.

Odpowiedz

6

Coś jak ...?

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 

Albo można zmienić

cfh[fv.field_definition] = fv 

... do ...

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

Korzystanie z iniekcji prawdopodobnie byłoby lepszą formą. Podobnie jak self.field_values.inject ({}) {| memo, fv | memo [fv.field_definition] = fv} lub podobne. –

+0

To jest to, co myślałem, że użyję ... zastanawiałem się, czy był bardziej "ruby" sposób to zrobić ... –

+0

Zwykły sposób prawdopodobnie nie użyłby skrótu w ogóle i po prostu skorzystał z wygenerowanego skojarzenia metody, ale myślę, że jest jakiś powód, dla którego byłeś szczególnie zainteresowany hash ...? –

1

Spójrz na Friendly ORM. Pozwala pracować z mysql bez schematu. Inspiracją dla tej metody było to, w jaki sposób Friendfeed używa mysql do przechowywania danych bezpodstawnych.

Przyjazny mógłby zastąpić ActiveRecord, chociaż można bardzo łatwo używać modeli ActiveRecord obok przyjaznych modeli.

+0

Nie dokładnie to, czego szukam, ale fajne znalezisko. +1 –

+0

Jeśli bierzesz pod uwagę dane bez schematu, możesz spojrzeć na użycie bazy danych dokumentów, takich jak CouchDB lub MongoDB (zobacz http://railscasts.com/episodes/194-mongodb-and-mongomapper dla webcastu na temat używania MongoDB i klejnot MongoMapper w aplikacji rails, Ryan Bates jest niesamowity). –

+0

Tak, zdecydowanie jestem tym zainteresowany. Jestem na Heroku, który obecnie nie działa z MongoDB. –

1

Jeśli twoim zamiarem jest, aby mieć swoje FieldDefinition rekordy należące do różnych modeli (na przykład kolumna item_id wskazujący albo SqueekyToyItem lub BalloonItem), a następnie, co chcesz to polimorficzny stowarzyszenie.

W zasadzie pozwala to na posiadanie kolumny item_type (obok kolumny item_id), która następnie określa rzeczywisty typ przedmiotu, który wskazuje.

W dokumentacji dla pozycji ActiveRecord::Associations::ClassMethods znajduje się nagłówek "Stowarzyszenia polimorficzne".

+0

Mam zamiar mieć je na wielu modelach, ale wszystkie one odziedziczą po Itemie (lub cokolwiek, co moja klasa podstawowa jest) –

Powiązane problemy