Rails - build_association不适用于has_one和belongs_to关系

rob*_*sco 9 activerecord ruby-on-rails associations

我有两个型号

class Subscription < ActiveRecord::Base
  belongs_to :client
end

class Client < ActiveRecord::Base
  has_one :subscription
end
Run Code Online (Sandbox Code Playgroud)

但是当我尝试从子节点创建父节点时,例如sub.build_client,外键不会被设置为例如

>> 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>
Run Code Online (Sandbox Code Playgroud)

如果我做client.build_subscription它确实有效

?> 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
Run Code Online (Sandbox Code Playgroud)

我花了3个小时摆弄,无处可去.任何人都可以解释我做错了什么,要检查的事情等等

Joh*_*ley 10

根据你的模型协会,a Subscription是a的孩子Client.

如果您先创建一个订阅,然后创建一个客户,按您的第一个例子,Rails有没有设定一个方式client_id的内外键值subscriptions,因为你还没有创建客户端记录该点位表,所以没有什么与关联订阅.这就是您必须首先创建父记录(即客户端)然后使用该build_subscription方法将其与子订阅记录相关联的原因.