我有两个模型
class Subscription < ActiveRecord::Base
belongs_to :client
end
class Client < ActiveRecord::Base
has_one :subscription
end
但是当我尝试从 child 创建 parent 时,例如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>
如果我执行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
我花了3个小时摆弄,却走不通。
谁能解释我做错了什么,要检查的东西等
最佳答案
根据您的模型关联,Subscription
是Client
的子代。
如果首先创建一个订阅,然后按照第一个示例创建一个客户端,Rails无法在client_id
表中设置subscriptions
外键值,因为此时您还没有创建客户端记录,因此没有任何关联与订阅。因此,您必须先创建父记录(即客户),然后使用build_subscription
方法将其与子订阅记录相关联。
关于ruby-on-rails - Rails-build_association不适用于has_one和belongs_to关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2040230/