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) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |