Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails/ActiveRecord:has\u one,属于\u并且在\u创建之前_Ruby On Rails_Ruby_Activerecord - Fatal编程技术网

Ruby on rails Rails/ActiveRecord:has\u one,属于\u并且在\u创建之前

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!

我很难弄清楚如何最好地为我的数据建模。我的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!
    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
所属的
——尽管在英语中看起来很糟糕。