2009-10-17 12 views

Odpowiedz

6

przykro mi, że nie znam żadnego pluginu, aby to zrobić. Ale mam sugestię wdrożenia.

Chodzi o to, aby dodać model "DynamicField", który byłby mającą wiele relacji z modelem Contact. Jeśli brakuje metody w modelu Contact, w takim przypadku należy sprawdzić, czy istnieje pole dynamiczne do pobrania.

class DynamicField < ActiveRecord::Base 
    belongs_to :contact 
end 


class Contact < ActiveRecord::Base 
    has_many :dynamic_fields 

    def method_missing(sym, *args, &block) 
     begin 
      super 
     rescue 
      field = dynamic_fields.find_by_name(sym) 
     end 
     raise ActiveRecord::NoMethodError if field.nil? 
     field.value 
    end 
end 

Trzeba będzie dodać regex jeśli chcesz dodać wirtualnych atrybutów z atrybutem = metoda (wykrywanie obecności a „=” i robi aktualizacji zamiast tylko uzyskanie wartości). Ale już masz pomysł.

Gdy ta metoda nie istnieje, sprawdzamy pola dynamiczne, jeśli istnieje taka sama nazwa. Jeśli nie ma (field.nil?), Podnosimy NoMethodError. W przeciwnym razie zwracamy.

Więc można uzyskać listę wszystkich pól z następujących czynności:

Contact.find(:first).dynamic_fields 

i pobrać konkretny jedną z następujących czynności:

Contact.find(:first).my_dynamic_field 
2

Oto kolejny sposób to zrobić.

Nota prawna: Ta metoda nie jest zalecana ze względu na możliwość nadużyć. W rzeczywistości powinien być dostępny tylko dla administratorów Twojej witryny.

class MyModel < ActiveRecord::Base 
    ... 
    def self.add_column(name, type, args= {}) 
    ActiveRecord::Migration.add_column table_name, name, type, args 
    end 
end 
Powiązane problemy