15

私は、Mongoid Ruby gem with Rails (Rails 3 beta 3) を通じて MongoDB を学んでおり、別のモデルのフィールドに基づいてモデルに動的属性を作成する方法を考え出そうとしています。より少ないデータベースが適しています。

たとえば、次のモデルがあります。

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

Account モデルの "info_needed" 属性を取得し、内容に基づいて Member モデルに動的属性を作成しようとしています。club.info_needed が ["first_name", "last_name"] の場合、first_name および last_name 属性を Member モデルに保存するフォームを作成しようとしています。

ただし、練習すると、これを実行しようとすると、メンバーモデルで「undefined method first_name =」エラーが発生し続けます。MongoDB がレコードごとに動的属性を処理できることは知っていますが、未定義のメソッド エラーなしで Mongoid にこれを実行させるにはどうすればよいでしょうか?

4

4 に答える 4

30

Mongoidはダイナミックフィールドをサポートするようになりました。それらのドキュメントはここにあります:http: //mongoid.org/en/mongoid/docs/documents.html#dynamic_fields

基本的に、ドキュメントに存在しなかったフィールドにgetterメソッドとsetterメソッドを使用しようとすると、メソッドエラーが発生しないため、動的フィールドの設定方法に少し注意する必要があることを警告します。

[]、[] =はread_attribute()、write_attribute()のショートカットであり、を設定しない場合は使用する必要がありdynamic_attributes = trueます。設定し./config/mongoid.yml fileない場合は、メソッドエラーは発生しません。

allow_dynamic_fields: trueコードのバグが原因でデータ/スキーマが意図しないフィールドで汚染される可能性があるため、設定にはリスクが伴う可能性があります。これを設定しfalseて明示的に[]、[]=を使用する方がおそらく安全です。

# 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")
于 2011-04-07T18:23:05.440 に答える
8

に必ずセットallow_dynamic_fields: trueしてくださいmongoid.yml。例:

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

...
于 2010-05-19T19:30:53.273 に答える
2

Mongoid と Rails 3.1 による動的属性に関する興味深い記事: http://paul-wong-jr.blogspot.com/2012/03/dynamic-attributes-and-mongodbmongoid.html

動的なキーと値のペアまたは動的な属性名のみにアクセスするには、以下も参照してください: Mongoid モデルの動的な属性を一覧表示する

于 2012-07-23T00:12:29.990 に答える
1

Mongoidは実際にはそれをサポートしていません。

たまたまMongoidグループでこれを聞いたことがあります。

次のように、新しいドキュメントを作成するときに可能です。

account = Account.new(:some_dynamic_field => "...")

于 2010-05-24T14:30:38.963 に答える