加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – Rails has_many通过条件,构建新的

发布时间:2020-12-17 03:38:49 所属栏目:百科 来源:网络整理
导读:我有用户和组织加入模型UsersOrganisation.用户可能是组织的管理员 – 如果是,则is_admin布尔值为true. 如果我在数据库中手动设置is_admin布尔值,Organisations.admins就像我期望的那样工作. 在控制台中,我可以做Organisation.first.users User.first,它会像
我有用户和组织加入模型UsersOrganisation.用户可能是组织的管理员 – 如果是,则is_admin布尔值为true.

如果我在数据库中手动设置is_admin布尔值,Organisations.admins就像我期望的那样工作.

在控制台中,我可以做Organisation.first.users<< User.first,它会像我期望的那样创建一个organisations_users条目. 但是,如果我做Organisation.first.admins<< User.last它创建普通用户,而不是管理员,即连接表上的is_admin布尔值未正确设置. 除了直接在连接表中创建条目之外,有没有其他方法可以做到这一点?

class User < ActiveRecord::Base

  has_many :organisations_users
  has_many :organisations,:through => :organisations_users

end

class Organisation <  ActiveRecord::Base

  has_many :organisations_users
  has_many :users,:through => :organisations_users
  has_many :admins,:through => :organisations_users,:class_name => "User",:source => :user,:conditions => {:organisations_users => {:is_admin => true}}

end

class OrganisationsUser < ActiveRecord::Base

  belongs_to :organisation
  belongs_to :user

end

解决方法

has_many有一些曲折:通过和<<操作符.但你可以像在@Erez的回答中一样超载它. 我的方法是使用范围(我将OrganisationsUsers重命名为Memberships):

class User < ActiveRecord::Base

  has_many :memberships
  has_many :organisations,:through => :memberships

end

class Organisation <  ActiveRecord::Base
  has_many :memberships
  has_many :members,:through => :memberships,:class_name => 'User',:source => :user

  # response to comment:
  def admins 
    memberships.admin
  end
end

class Memberships < ActiveRecord::Base

  belongs_to :organisation
  belongs_to :user

  scope :admin,where(:is_admin => true)
end

现在我创建这样的新管理员:

Organisation.first.memberships.admin.create(:user => User.first)

我喜欢的范围是你在会员类中定义“会员类型”,组织本身根本不需要关心会员类型.

更新:

现在你可以做到

Organisation.first.admins.create(:user => User.first)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读