Ruby on rails Rails使一个模型需要另一个模型
如果我有一个Ruby on rails Rails使一个模型需要另一个模型,ruby-on-rails,database-design,activerecord,model,database-relations,Ruby On Rails,Database Design,Activerecord,Model,Database Relations,如果我有一个has\u和\u属于两个模型之间的多个关系,比如说用户和帐户,我是否可以要求用户至少有一个帐户,以及如何要求 此外,使用has_和 您需要创建两个新模型,account_用户和account_账单。您可能已经有了HABTM的连接表,但这将把它们公开为模型,因此它们需要ID字段 因此,您将得到如下结果: class Account < ActiveRecord::Base has_many :account_billers has_many :account_users
has\u和\u属于两个模型之间的多个关系,比如说用户和帐户,我是否可以要求用户至少有一个帐户,以及如何要求
此外,使用has_和
关系,帐户
是否可能没有用户
我需要的是一种关系,在这种关系中,账户
可以独立生活,并且属于账单
,但如果用户
注册了,它们也可以属于用户。这有可能吗?怎么可能?我个人会放弃HABTM。相反,我会使用has\u many:虽然=>
您需要创建两个新模型,account_用户和account_账单。您可能已经有了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
类帐户:账户\u账单
拥有\u多个:用户,:通过=>:帐户\u用户
结束
类用户:帐户\u用户
验证:帐户,:长度=>{:最小=>1}
结束
类Biller:账户\u账单
验证:帐户,:长度=>{:最小=>1}
结束
类AccountUser
要验证是否存在至少一个关联,您可能需要使用
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
class用户
(尽管这带来了用户之间如何共享帐户的问题)
对于你的第二个问题,看起来像是你正在寻找的,但是你不能直接用HABTM关系来实现这一点,你必须将其更改为has\u many:through
,并引入一个联接模型。这将设置一个要求,即用户和账单者都有帐户,但是帐户可以在没有用户或账单的情况下存在。您可以使用多态性,但没有好的方法使用多态性来执行FK约束。如果user1521444还没有很好地掌握模型和关系,我会避免这种情况。有了多态关联,你似乎可以拥有一个属于用户或账单者的帐户,但是,在多态关联下,同一个帐户可以同时属于这两个帐户吗?如果您可以同时拥有属于用户和账单用户的帐户,我认为AR不支持这种开箱即用的方式。你可以检查这个问题