我正在使用Rails应用。 我在Rails协会中遇到了一个问题: 我有3个模型:用户,公司和公司成员
# id :integer not null, primary key
class User < ActiveRecord::Base
has_one :company_member
has_one :company, through: :company_member
end
# id :integer not null, primary key
# name :string(255) not null
class Company < ActiveRecord::Base
has_many :company_members
has_many :members, through: :company_members, foreign_key: "user_id", source: :user
has_many :admins, -> {where admin: true }, through: :company_members, foreign_key: "user_id", source: :user
end
# id :integer not null, primary key
# company_id :integer
# user_id :integer
# admin :boolean
# created_at :datetime
# updated_at :datetime
class CompanyMember < ActiveRecord::Base
belongs_to :company
belongs_to :user
end
用户只能拥有一家公司。他可以成为这家公司的管理员。公司可以拥有多个管理员。
所以,当我想向我所做的公司添加一名成员时:company.members&lt;&lt;用户。它正在工作:当我查询company.members它返回用户并且company_member记录就像 {user_id:5,company_id:8,admin:false}
现在我想添加一个用户作为管理员:我必须做的是:company.admins&lt;&lt;用户 那么company.members应该返回与company.admins相同的用户 和company_member记录应该是一样的 {user_id:5,company_id:8,admin:true}
通过Rails协会可以吗?因为实际上,它不起作用:/:company_member记录为{user_id:5,company_id:8,admin:false} 你能救我吗?
谢谢!
我使用的是Rails 4.1.3和ruby 2.1.2
答案 0 :(得分:1)
在has_many
关系中指定范围时,只能自定义has_many使用的查询。因此,如果您将用户添加到公司的管理员列表中,则不会使其成为管理员。
您可以通过设置关联回调来实现此目的。 Rails将要添加或删除的对象传递给回调,您可以将其设置为admin。
class Company < ActiveRecord::Base
has_many :company_members
has_many :members, through: :company_members, foreign_key: "user_id", source: :user
has_many :admins, -> {where admin: true }, through: :company_members, foreign_key: "user_id", source: :user, after_add: :set_user_as_admin
def set_user_as_admin(user)
user.company_member.update(admin: true)
end
end
答案 1 :(得分:0)
如果有人有兴趣,我想到了什么:
在公司,协会管理员必须是这样的:
class Company < ActiveRecord::Base
has_many :company_members
has_many :members, through: :company_members, source: :user
has_many :admins, -> {where(company_members: {admin: true })}, through: :company_members, source: :user
end
现在我有了预期的行为
company.admins << user
它使用admin:true(默认为false)添加instanciate company_member
所以我不需要SampritiPanda建议的回电,但谢谢老兄!