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?

Author: joeellis, 2010-04-23

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 => "...")

 1
Author: Vojto,
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")
 26
Author: Ben Zittlau,
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

...
 7
Author: gucki,
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

 1
Author: Tilo,
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