gpt4 book ai didi

ruby-on-rails - 创建具有关联的模型实例

转载 作者:数据小太阳 更新时间:2023-10-29 07:37:48 26 4
gpt4 key购买 nike

我正在开发 Rails 应用程序。我遇到了 Rails 关联的问题:我有 3 个模型:User、Company 和 CompanyMember

#  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 << user.它正在工作:当我查询 company.members 时,它返回用户并且 company_member 记录就像{user_id: 5, company_id: 8, admin: false}

现在我想添加一个用户作为管理员:我需要做的是:company.admins << user然后 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

最佳答案

当您在has_many 关系中指定范围时,您只自定义has_many 使用的查询。因此,如果您将用户添加到公司的管理员列表中,它不会使其成为管理员。

您可以通过设置关联回调来实现此目的。 Rails 将添加或删除的对象传递给回调,您可以将其设置为管理员。

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

关于ruby-on-rails - 创建具有关联的模型实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25157490/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com