Atrybuty dynamiczne z Rails i Mongoid
Uczę się MongoDB poprzez Mongoid Ruby gem with Rails (rails 3 beta 3) i próbuję wymyślić sposób na tworzenie dynamicznych atrybutów na modelu w oparciu o pola z innego modelu, do którego pomyślałem, że baza danych bez schematu byłaby dobrym wyborem.
Więc na przykład miałbym modele:
class Account
include Mongoid::Document
field :name, :type => String
field :token, :type => String
field :info_needed, :type => Array
embeds_many :members
end
class Member
include Mongoid::Document
embedded_in :account, :inverse_of => :members
end
Chcę wziąć atrybut "info_needed" modelu konta i utworzyć dynamiczne atrybuty na modelu członka w oparciu o to, co jest w środku. If club. info_needed czy ["first_name", "last_name"], próbuję utworzyć formularz, który zapisałby atrybuty first_name i last_name do modelu członka.
Jednak, po praktyce, ciągle dostaję błędy "undefined method first_name=" w modelu Member, gdy próbuję to zrobić. Wiem, że MongoDB może obsługiwać dynamiczne atrybuty dla każdego rekordu, ale jak mogę zmusić Mongoid do zrobienia tego bez niezdefiniowanego błędu metody?
4 answers
Mongoid tak naprawdę go nie wspiera.
Tak się składa, że sam zapytałem o to w Mongoid group.Jest to możliwe przy tworzeniu nowego dokumentu, jak poniżej:
account = Account.new(:some_dynamic_field => "...")
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-05-24 14:30:38
Mongoid obsługuje teraz dynamiczne pola. Ich dokumentację można znaleźć tutaj: http://mongoid.org/en/mongoid/docs/documents.html#dynamic_fields
Zasadniczo ostrzega, że musisz być nieco ostrożny w ustawianiu dynamicznych pól, ponieważ spowoduje to błąd no method, jeśli spróbujesz użyć metod getter i setter dla pól, które nie istniały w dokumencie.
[],[]= są skrótami dla read_attribute(),write_attribute () i powinny być używane, jeśli nie ustawisz dynamic_attributes = true
w twoim ./config/mongoid.yml file
, w przeciwnym razie dostaniesz błąd no method.
Ustawienie allow_dynamic_fields: true
może być ryzykowne, ponieważ możesz zanieczyścić swoje dane / schemat niezamierzonymi polami spowodowanymi błędami w kodzie. Prawdopodobnie bezpieczniej jest ustawić to na false
i jawnie użyć [], [] =
# Raise a NoMethodError if value isn't set.
person.gender
person.gender = "Male"
# Retrieve a dynamic field safely.
person[:gender]
person.read_attribute(:gender)
# Write a dynamic field safely.
person[:gender] = "Male"
person.write_attribute(:gender, "Male")
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-07-23 00:16:59
Pamiętaj, aby ustawić allow_dynamic_fields: true
w mongoid.yml
. Przykład:
defaults: &defaults
allow_dynamic_fields: true
parameterize_keys: true
persist_in_safe_mode: true
raise_not_found_error: true
reconnect_time: 3
use_object_ids: false
development:
<<: *defaults
...
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-05-19 19:38:29
Ciekawy artykuł o dynamicznych atrybutach z Mongoid i Rails 3.1: http://paul-wong-jr.blogspot.com/2012/03/dynamic-attributes-and-mongodbmongoid.html
Aby uzyskać dostęp tylko do dynamicznych par klucz / wartość lub dynamicznych nazw atrybutów, Zobacz też: Lista dynamicznych atrybutów w modelu Mongoid
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:09:03