2012-03-26 73 views
3

我有一个用户模型和一个帐户模型。用户拥有多个帐户,并且这些帐户属于一个用户。我有所有的模型和协会。现在我想让其中一个帐户成为“主帐户”。建立关联的最佳方式是什么?我在我的用户表中添加了一个primary_account_id列,并设置了这样的关联,但它不起作用。有小费吗?模型中的多个关联

class User < ActiveRecord::Base 
    has_many :accounts 
    has_one :primary_account, :class_name => "Account" 
end 

class Account < ActiveRecord::Base 
    belongs_to :user 
end 

编辑

我看到这个问题Rails model that has both 'has_one' and 'has_many' but with some contraints这是非常相似,第二个答案让我尝试了建议。然而,当我使用它轨忽略了我所做的列,只是抓住表中的第一个:

>> u = User.find(1) 
    User Load (3.9ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT 1 [["id", 1]] 
=> #<User id: 1, email: "[email protected]", created_at: "2012-03-15 22:34:39", updated_at: "2012-03-15 22:34:39", primary_account_id: nil> 
>> u.primary_account 
    Account Load (0.1ms) SELECT "accounts".* FROM "accounts" WHERE "accounts"."user_id" = 1 LIMIT 1 
=> #<Account id: 5, name: "XXXXXX", created_at: "2012-03-16 04:08:33", updated_at: "2012-03-16 17:57:53", user_id: 1> 
>> 
+1

可能:'has_one:primary_account,:class_name =>“Account”,:conditions =>“users.primary_account_id = accounts.id”'。 – Zabba 2012-03-26 01:03:20

+0

好猜,但没有:'帐户加载(0.2ms)SELECT“accounts”。* FROM“accounts”WHERE“accounts”。“user_id”= 1 AND(users.primary_account_id = accounts.id)LIMIT 1 SQLite3 :: SQLException:no such column:users.primary_account_id:SELECT“accounts”。* FROM“accounts”WHERE“accounts”。“user_id”= 1 AND(users.primary_account_id = accounts.id)LIMIT 1' – jasonlfunk 2012-03-26 01:10:42

回答

6

所以我创建了一个简单的ERD,你的问题很简单,但我想我找到了严重的问题:

simple erd

class User < ActiveRecord::Base 
    has_many :accounts 
    has_one :primary_account, :class_name => "Account", :primary_key => "account_pimary_id" 
end 

class Account < ActiveRecord::Base 
    belongs_to :user 
end 

为了得到协会原样,只需设置:primary_keyhas_one :primary_account,以便它使用users.account_primary_id,而不是users.id

虽然这样做,它可能会引起问题,只会造成什么。如果帐户的user_id用作idaccount_primary_id的外键,则不必每次明确加入idaccount_primary_id都不知道帐户是普通帐户还是主帐户。 A foreign_key应该只指向1列,在这种情况下,用户表id。然后这是对账户表格的直接拍摄。

@Zabba解决方案是聪明的,只是需要:include为加入

has_one :primary_account, :class_name => "Account", :conditions => "users.primary_account_id = accounts.id", :include => :user 

这就意味着所有的账户都属于用户和1只被标记为基本账户。好而直截了当,避免古怪的条款。

+0

Thank you!--- --- – jasonlfunk 2012-03-26 15:20:09