Ruby on rails 同时具有';有一个';和';有很多';但是有一些限制
我正在映射两个模型:Ruby on rails 同时具有';有一个';和';有很多';但是有一些限制,ruby-on-rails,activerecord,Ruby On Rails,Activerecord,我正在映射两个模型: User Account class Account has_many :users class User has_one :account 用户表作为其中的帐户id 现在,在帐户模型上,我想创建一个“主要用户”,一个帐户只有1个关。 用户表有一个布尔标志:is_primary,如何在帐户端为映射了is_primary和account_id的用户创建has_one 因此SQL看起来像: SELECT * FROM users where account_i
User
Account
class Account
has_many :users
class User
has_one :account
用户表作为其中的帐户id
现在,在帐户模型上,我想创建一个“主要用户”,一个帐户只有1个关。
用户表有一个布尔标志:is_primary,如何在帐户端为映射了is_primary和account_id的用户创建has_one
因此SQL看起来像:
SELECT * FROM users where account_id=123 and is_primary = 1
所以我想:
用户有一个帐户。
一个帐户有多个用户,同时也有一个主用户。将主用户id字段添加到帐户,并为主用户添加“has\u one”关联可能会更简单:
class Account
has_many :users
has_one :primary_user, :class_name => "User"
end
class User
has_one :account
end
如果必须使用现有架构(带有:is_primary boolean标志),可以添加如下范围:
class User
has_one :account
scope :primary, where(:is_primary => true)
end
然后将范围链接到用户查找:
account = Account.find(1)
primary_user = account.users.primary.first
方法1-添加新关联 添加一个
与关联的,其中为lambda。这允许您在当前模式中工作
class Account
has_many :users
has_one :primary_user, -> { where(is_primary: true) }, :class_name=> "User"
end
现在:
方法2-添加关联方法
class Account
has_many :users do
def primary
where(:is_primary => true).first
end
end
end
现在:
非常感谢您对这一点的评论,因为它是相关的:好和干净的方法。您是否介意解释如何使用方法1,使用(集合)选择的所有用户更新帐户更新表单中的主要用户?感谢you@Patient55您是否尝试过将接受嵌套属性\u用于?+1用于第一种方法。虽然account.users.primary
比account.users.primary.first
更具表现力,因为命名约定并不顺利。但是,通过调用作用域primaries
,并将类方法定义为def self.primary,可以很容易地纠正这一问题;初选。第一;结束
。现在,您可以使用general scopeprimaries
,或方法primary
引用单个记录(其中只需要1条记录)-1帐户没有存储用户信息的业务。最干净的方法是引入AccountPrimaryUserTie模型,并对account\u primary\u用户进行唯一性验证。account\u id
列将确保只有一个primary用户。
class Account
has_many :users do
def primary
where(:is_primary => true).first
end
end
end
account.users.primary # returns the primary account