我正在研究rails中的has_one :through association的Active Record Associations文档,并根据Account / Supplier / AccountHistory示例在控制台中进行一些实验。
所以,如果我这样做......
@supplier = Supplier.create(name: "Acme")
=> #<Supplier id: 1, name: "Acme", ...>
@supplier.create_account(account_number: "123")
=> #<Account id: 1, supplier_id: 1, account_number: "123", ...>
@account = @supplier.account
=> #<Account id: 1, supplier_id: 1, account_number: "123", ...>
@account.create_account_history(credit_rating: 456)
=> #<AccountHistory id: 1, account_id: 1, credit_rating: 456, ...>
@supplier.account_history
=> #<AccountHistory id: 1, account_id: 1, credit_rating: 456, ...>
我看到只返回一条记录。说得通。如果我这样做......
@supplier.account.create_account_history(credit_rating: 789)
=> #<AccountHistory id: 2, account_id: 1, credit_rating: 789, ...>
@supplier.account_history
=> #<AccountHistory id: 2, account_id: 1, credit_rating: 789, ...>
同样,只返回一条记录。在这种情况下,新记录的信用评级为789。
两个问题。首先,这个例子是否能很好地封装has_one的目的:通过关联?重点是返回单个记录/对象而不是从has_many关联中获取的对象数组?
其次,协会如何决定返回哪条单曲?在上面的示例中,AccountHistory表中现在有两条记录:
AccountHistory.all
AccountHistory Load (0.2ms) SELECT "account_histories".* FROM "account_histories"
=> #<ActiveRecord::Relation [#<AccountHistory id: 1, account_id: nil, credit_rating: 456, ...>, #<AccountHistory id: 2, account_id: 1, credit_rating: 789, ...>]>
对@supplier.account_history
的调用是否只返回插入的最后一条记录?
答案 0 :(得分:1)
当您放入控制台AccountHistory.all
时,答案是关系
1.- for has_one:through是好的,因为只有一条记录与另一条记录相关联,即只有当帐户存在时,供应商才能拥有AccountHistory,因为Account和AccountHistory是相关的。
2.-关联通过关联表的id知道返回的对象,这意味着帐户的account_id,如果检查终端中的输出,则有两条记录,但一条是nil,另一条是与您的帐户相关联1
account_id:nil
,credit_rating:456,...&gt;,#
account_id:1
,credit_rating:789,...&gt;]&gt;
因此,如果您放入控制台@account = Account.find(1)
然后@account.account_history.credit_rating
,您将拥有789。