模型中的多个关联

jas*_*unk 3 ruby-on-rails activemodel

我有一个用户模型和一个帐户模型.用户拥有多个帐户,帐户属于一个用户.我已经建立了模型和协会.现在我想将其中一个帐户设为"主帐户".建立关联的最佳方式是什么?我在我的用户表中添加了一个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
Run Code Online (Sandbox Code Playgroud)

编辑

我看到这个问题Rails模型既有'has_one'又有'has_many',但有一些非常相似的约束,第二个答案提出了我尝试过的建议.但是当我使用它时,rails会忽略我所创建的列,并抓住表中的第一个:

>> u = User.find(1)
  User Load (3.9ms)  SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT 1  [["id", 1]]
=> #<User id: 1, email: "XXXXXXX@gmail.com", 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>
>> 
Run Code Online (Sandbox Code Playgroud)

mgu*_*mon 6

所以我创建了一个简单的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
Run Code Online (Sandbox Code Playgroud)

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

虽然这是有效的,但它可能会导致问题.如果账户的user_id用作外键idaccount_primary_id,你不知道,如果一个账户是正常的帐户或不明确地加入这两个基本账户idaccount_primary_id每一次.A foreign_key应该只指向1列,在本例中是User表id.然后它直接进入账户表.

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

has_one :primary_account, :class_name => "Account", :conditions => "users.primary_account_id = accounts.id", :include => :user
Run Code Online (Sandbox Code Playgroud)

这意味着所有帐户都属于用户,只有1帐户被标记为主帐户.很好,直接,避免古怪的条款.