Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/53.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-build\u关联不适用于has\u one且属于关系_Ruby On Rails_Activerecord_Associations - Fatal编程技术网

Ruby on rails Rails-build\u关联不适用于has\u one且属于关系

Ruby on rails Rails-build\u关联不适用于has\u one且属于关系,ruby-on-rails,activerecord,associations,Ruby On Rails,Activerecord,Associations,我有两种型号 class Subscription < ActiveRecord::Base belongs_to :client end class Client < ActiveRecord::Base has_one :subscription end 类订阅 # >>sub.save(假); ?>client=sub.build\u client => # >>client.save(false) =>正确 >>子客户号 =>零 >>潜艇 => # 如果我执行c

我有两种型号

class Subscription < ActiveRecord::Base
  belongs_to :client
end

class Client < ActiveRecord::Base
  has_one :subscription
end
类订阅
但是,当我尝试从子级创建父级时,例如sub.build\u客户端,外键没有设置,例如

>> sub = Subscription.new
=> #<Subscription id: nil, token: nil, user_id: nil, created_at: nil, updated_at: nil, cancelled: nil, active: nil, client_id: nil>
>> sub.save(false);
?> client = sub.build_client
=> #<Client id: nil, server_id: nil, ip: nil, created_at: nil, updated_at: nil>
>> client.save(false)
=> true
>> sub.client_id
=> nil
>> sub
=> #<Subscription id: 4, token: nil, user_id: nil, created_at: "2010-01-11 06:07:45", updated_at: "2010-01-11 06:07:45", cancelled: nil, active: nil, client_id: nil>
>sub=Subscription.new
=> #
>>sub.save(假);
?>client=sub.build\u client
=> #
>>client.save(false)
=>正确
>>子客户号
=>零
>>潜艇
=> #
如果我执行client.build\u订阅,它确实有效

?> client = Client.new
=> #<Client id: nil, server_id: nil, ip: nil, created_at: nil, updated_at: nil>
>> client.save(false)
=> true
>> sub = client.build_subscription
=> #<Subscription id: nil, token: nil, user_id: nil, created_at: nil, updated_at: nil, cancelled: nil, active: nil, client_id: 4>
>> sub.save(false)
=> true
>> sub
=> #<Subscription id: 5, token: nil, user_id: nil, created_at: "2010-01-11 06:09:32", updated_at: "2010-01-11 06:09:32", cancelled: nil, active: nil, client_id: 4>
>> client
=> #<Client id: 4, server_id: nil, ip: nil, created_at: "2010-01-11 06:09:02", updated_at: "2010-01-11 06:09:02">
>> ^C
?>client=client.new
=> #
>>client.save(false)
=>正确
>>sub=client.build\u订阅
=> #
>>sub.save(假)
=>正确
>>潜艇
=> #
>>客户
=> #
>>^C
我花了三个小时摆弄小提琴,结果一无所获。
有人能解释一下我做错了什么,要检查的东西等等吗根据你的模型关联,
订阅
客户
的孩子


如果您先创建订阅,然后按照第一个示例创建客户机,Rails无法在
subscriptions
表中设置
client\u id
外键值,因为此时您尚未创建客户机记录,因此没有与订阅相关联的内容。这就是为什么您必须首先创建父记录(即客户端),然后使用
build\u subscription
方法将其与子订阅记录关联。

这两种方法都不起作用,父级可以使用build\u association方法生成子级,反之亦然


阅读:

在我的项目中,我有许多类似的关联,但我经常禁止将client_id设置为null,因此我无法创建没有父对象的子对象

尝试:


它将创建并保存这两个对象。

在其中一个注释中,您会问为什么会有build\u client方法。当您保存客户端,然后检查sub上的客户端id时,它是nil,但是如果您也调用了

sub.save(validate: false)

然后检查sub上的客户端id,它将存在。因此,尽管它需要额外的保存,但它仍然具有为sub设置外键的魔力。

这似乎已在Rails 4.2.5或更早版本中修复。(我不确定最早的版本是什么,我只测试了4.2.5。)

保存父记录时,插入父记录后,将自动执行更新以将父id添加到子记录

但是,我还没有找到任何关于此行为、相关代码或自动测试的文档,因此我不确定它是否是故意修复的,是否应该依赖此行为。最好还是坚持其他答案中的解决方案


这似乎也是由于Rails 4.2.5中的许多内容而被打破的。

谢谢john,我原以为是这样的(我确实查阅了Rails指南,但找不到对此的解释,所以想在这里确认一下stackoverflow)。但是为什么有很多属于关系的东西可以做到这一点呢?我只是想如果不能做到的话,为什么会有构建方法呢?如果无法设置外文id,那么这种方法在这种关系中有什么用?你是指我第一次回复、第二次回复中的方法还是两者都有?我可能会问这个新问题。
sub.save(validate: false)