如果我有两个模型之间的has_and_belongs_to_many
关系,假设Users
和Accounts
,我可以要求一个User
至少有一个Account
吗?
另外,使用has_and_belongs_to_many
关系,Account
是否有可能没有User
?
我需要的是一段关系,Accounts
可以独立生活,属于Billers
,但如果User
签约,他们也可以属于Users
。这可能吗,如何?
我个人会放弃HABTM。 相反,我会使用has_many :though=>
您需要创建两个新模型:account_users 和account_billers。 您可能已经有 HABTM 的连接表,但这会将它们公开为模型,因此它们需要 ID 字段。
所以你最终会得到如下的东西:
class Account < ActiveRecord::Base
has_many :account_billers
has_many :account_users
has_many :billers, :through=> :account_billers
has_many :users, :through=> :account_users
end
class User < ActiveRecord::Base
has_many :account_users
has_many :accounts, :through=>:account_users
validates :accounts, :length => { :minimum => 1}
end
class Biller < ActiveRecord::Base
has_many :account_billers
has_many :accounts, :through=>:account_billers
validates :accounts, :length => { :minimum => 1}
end
class AccountUser < ActiveRecord::Base
belongs_to :user
belongs_to :account
end
class AccountBiller < ActiveRecord::Base
belongs_to :biller
belongs_to :account
end
若要验证至少一个关联的是否存在,可能需要使用自定义验证方法,例如
class User < ActiveRecord::Base
has_and_belongs_to_many :accounts
validate :require_at_least_one_account
private
def require_at_least_one_account
errors.add(:accounts, "must amount to at least one") if accounts.size < 1
end
end
(尽管这带来了如何在用户之间共享帐户的问题(
对于第二个问题,看起来多态关联是你正在寻找的,但你不能直接使用 HABTM 关系做到这一点,你必须将其更改为has_many :through
并引入连接模型。