joe*_*lis 15 ruby-on-rails dynamic-attributes mongodb mongoid
我正在通过带有Rails(Rails 3 beta 3)的Mongoid Ruby gem学习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
Run Code Online (Sandbox Code Playgroud)
我希望获取Account模型的"info_needed"属性,并根据内部的内容在Member模型上创建动态属性.如果club.info_needed是["first_name","last_name"],我正在尝试创建一个将first_name和last_name属性保存到Member模型的表单.
但是,在练习时,我只是在尝试执行此操作时不断在成员模型上获得"undefined method first_name ="错误.我知道MongoDB可以处理每个记录的动态属性,但是如何在没有未定义的方法错误的情况下让Mongoid执行此操作?
Ben*_*lau 28
Mongoid现在支持动态字段.他们的文档可以在这里找到:http: //mongoid.org/en/mongoid/docs/documents.html#dynamic_fields
基本上,它警告您必须小心谨慎设置动态字段,因为如果您尝试对文档中不存在的字段使用getter和setter方法,则会引发no方法错误.
[],[] =是read_attribute(),write_attribute()的快捷方式,如果没有设置dynamic_attributes = true,则应该使用./config/mongoid.yml file,否则你将得到no方法错误.
设置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")
Run Code Online (Sandbox Code Playgroud)
一定要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
...
Run Code Online (Sandbox Code Playgroud)