使用关联创建模型实例

时间:2014-08-06 10:03:05

标签: ruby-on-rails ruby ruby-on-rails-4 associations

我正在使用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

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建议的回电,但谢谢老兄!