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 scope
primaries
,或方法
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