【发布时间】:2011-09-07 05:36:52
【问题描述】:
我正在尝试创建一个具有嵌入式属性的对象以进行测试。此示例使用具有多种语言的用户,但我希望为创建嵌入式对象的一般情况提供解决方案。
目前的创建代码:
def valid_attributes
{ :languages => [Language.new(language: "en-US", proficiency: "1")] }
end
user = User.create! valid_attributes
模型:
class User
include Mongoid::Document
field :languages
embeds_many :languages
validates_presence_of :languages
attr_accessible :languages_attributes
accepts_nested_attributes_for :languages, :reject_if => lambda { |a| a[:language].blank? }, :allow_destroy => true
end
class Language
include Mongoid::Document
field :language
field :proficiency
key :language
embedded_in :user
attr_accessible :language, :proficiency
end
这些模型适用于从 Ryan Bates 的足迹 (https://github.com/ryanb/complex-form-examples) 中的嵌套表单创建对象。我不知道这是否是正确的方式,但我认为是这样。
我可以看到一些明显的解决方案。一种是对输入进行硬编码,就像从表单生成的一样:
{"user"=>{ "languages_attributes"=>{"0"=>{"language"=>"en-US", "proficiency"=>"1", "_destroy"=>"false", "id"=>"en-dash-us"}}}
对我来说,从长远来看,这似乎并不干燥或理智。
另一种解决方案是仅剪切嵌入的对象并使用数组。 Mongoid 非常擅长支持数组,但是您失去了为每个对象编写验证的能力,并且代码的可重用性会降低。
想法,Stackoverflowers?
【问题讨论】: