了解has_one:通过

时间:2017-03-21 13:48:13

标签: ruby-on-rails activerecord console

我正在研究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的调用是否只返回插入的最后一条记录?

1 个答案:

答案 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。