Ruby on rails Rails/ActiveRecord:has\u one,属于\u并且在\u创建之前
我很难弄清楚如何最好地为我的数据建模。我的Rails应用程序中有以下两种型号:Ruby on rails Rails/ActiveRecord:has\u one,属于\u并且在\u创建之前,ruby-on-rails,ruby,activerecord,Ruby On Rails,Ruby,Activerecord,我很难弄清楚如何最好地为我的数据建模。我的Rails应用程序中有以下两种型号: class Foo < ActiveRecord::Base belongs_to :active_bar, :class_name => 'Bar' accepts_nested_attributes_for :active_bar before_create do |f| f.active_bar.foo = f # Causes stack overflow!
class Foo < ActiveRecord::Base
belongs_to :active_bar, :class_name => 'Bar'
accepts_nested_attributes_for :active_bar
before_create do |f|
f.active_bar.foo = f
# Causes stack overflow!
f.active_bar.save!
end
end
class Bar < ActiveRecord::Base
belongs_to :foo
end
test 'create with nested attributes' do
f = Foo.create!(:name => 'foo-name', :active_bar_attributes => {:name => 'bar-name'})
assert_equal 'foo-name', f.name
assert_equal 'bar-name', f.active_bar.name
assert_equal f, f.active_bar.foo
f_id = f.to_param
retrieved_f = Foo.find_by_id!(f_id)
assert_equal retrieved_f, retrieved_f.active_bar.foo
end
class Foo'bar'
接受\u嵌套的\u属性\u用于:活动\u栏
在创建do | f之前|
f、 主动_bar.foo=f
#导致堆栈溢出!
f、 活动工具栏。保存!
结束
结束
类栏'foo name',:active_bar_attributes=>{:name=>'bar name'})
断言_等于'foo name',f.name
断言等于'bar name',f.active'u bar.name
断言等于f,f.active\u bar.foo
f_id=f.to_参数
已检索\u f=Foo.find\u by\u id!(f_id)
断言等于检索到的,检索到的,活动的
结束
你可能觉得奇怪的是,我试图建立的反身的关系属于关系。我的计划是,最终,Foo
将有多个Bar
实例,而一个实例将被视为“活动”。因此,我使用active\u bar
来引用这个活动实例。这段代码的问题是,我需要将Bar
中的foo
属性设置回父foo
实例,但我无法找到执行此操作的最佳位置(在创建之前,保存!
调用)即使这是建立这种关系模型的最干净的方法
本质上,我试图模拟一个用户(相当于Foo
),该用户有多个电子邮件地址(相当于Bar
),其中一个电子邮件地址标记为用户的主地址
有什么建议吗?如果您同意的话,我只想就用户和电子邮件地址做出回应;)
在您的用户模型中,应该是有很多:电子邮件地址
,有一个:活动电子邮件,:class\u name=>“EmailAddress”
,并且,正如您正确识别的那样,接受:电子邮件地址的嵌套属性
当然,EmailAddress模型应该有属于:User
除此之外,我认为你想得太多了。在表单中创建一个用户,然后,允许他们输入他们想要的任意多个电子邮件地址,或者让他们先输入他们的“活动”电子邮件,或者通过某种切换来指示哪个电子邮件地址是他们的主地址
编辑:对于before_create语句,我认为只需要简单地验证是否已给出/标记了主电子邮件地址(如果有必要首先指定电子邮件地址)
如果这还不能满足您需要的功能,请发表评论。我会尽力提供更多帮助。我想我会在创建之前将中的代码移动到创建之后的。这似乎奏效了。然而,我仍然不完全满意所模拟的关系。谢谢你的提示!当我有机会的时候,我会尝试一下-理查迪也有同样的问题。active\u email\u id
的实际值存储在哪里?在rails术语中,不应该has_one
是所属的
——尽管在英语中看起来很糟糕。