Bla*_*man 21 activerecord ruby-on-rails
我正在映射2个模型:
User
Account
class Account
has_many :users
class User
has_one :account
Run Code Online (Sandbox Code Playgroud)
用户表作为其中的account_id.
现在在帐户模型上我想创建一个帐户只有1个关闭的"主要用户".用户表有一个布尔标志:is_primary,如何在帐户端为具有is_primary和account_id映射的用户创建has_one.
所以SQL看起来像:
SELECT * FROM users where account_id=123 and is_primary = 1
Run Code Online (Sandbox Code Playgroud)
所以我想:
用户拥有一个帐户.帐户有很多用户,并且还有一个主要用户.
Har*_*tty 46
方法1 - 添加新关联
添加has_one与wherelambda 的关联.这允许您在当前架构中工作.
class Account
has_many :users
has_one :primary_user, -> { where(is_primary: true) }, :class_name=> "User"
end
Run Code Online (Sandbox Code Playgroud)
现在:
account.users #returns all users associated with the account
account.primary_user #returns the primary user associated with the account
# creates a user with is_primary set to true
account.build_primary_user(name: 'foo bar', email: 'bar@foo.com')
Run Code Online (Sandbox Code Playgroud)
方法2 - 添加关联方法
class Account
has_many :users do
def primary
where(:is_primary => true).first
end
end
end
Run Code Online (Sandbox Code Playgroud)
现在:
account.users.primary # returns the primary account
Run Code Online (Sandbox Code Playgroud)
将primary_user_id字段添加到Account并为primary_user添加'has_one'关联可能更简单:
class Account
has_many :users
has_one :primary_user, :class_name => "User"
end
class User
has_one :account
end
Run Code Online (Sandbox Code Playgroud)
如果必须使用现有模式(使用:is_primary boolean标志),则可以添加如下范围:
class User
has_one :account
scope :primary, where(:is_primary => true)
end
Run Code Online (Sandbox Code Playgroud)
然后将范围链接到用户查找:
account = Account.find(1)
primary_user = account.users.primary.first
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8577 次 |
| 最近记录: |