我的rails应用程序具有用户模型和角色模型。每个用户属于一个角色,每个角色都有许多用户。用户模型中定义了三种方法来检查该用户def admin?
,def user?
和def expert?
的角色。
用户类:
class User < ActiveRecord::Base
mount_uploader :avatar, AvatarUploader
validates_presence_of :name
validates_presence_of :avatar
validates_integrity_of :avatar
validates_processing_of :avatar
before_save :assign_role
# Include default devise modules. Others available are:
# :confirmable, :lockable, :timeoutable and :omniauthable
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable
belongs_to :role
has_many :items
belongs_to :organization
has_many :expertkeywordmodels
has_many :keywords, through: :expertkeywordmodels
def assign_role
self.role = Role.find_by name: "Admin" if self.role.nil?
end
def self.with_role(role)
my_role = Role.find_by_name(role)
where(:role => my_role)
end
def admin?
self.role.name == "Admin"
end
def user?
self.role.name == "User"
end
def expert?
self.role.name == "Expert"
end
end
角色类:
class Role < ActiveRecord::Base
has_many :users
end
我正在尝试仅为具有collection_select
角色的用户创建expert
。类似的东西:
<%= collection_select(:keyword, :user_ids, User.where('expert?'), :id, :name, {prompt: true}, {:multiple => true}) %>
但它不承认expert?
是一种方法。我想知道是否有人知道如何执行此查询。
如果这是一个天真的问题,我很抱歉,因为我不熟悉rails。
谢谢, 阿米尔
答案 0 :(得分:1)
User.where('expert?')
对数据库没有任何意义,因为它会转换为SQL,如:
SELECT * FROM users WHERE expert?;
显然expert?
不是有效的SQL表达式。 expert?
仅适用于您的代码。
相反,您需要以转换为有效SQL的方式编写该逻辑,并在数据库模式的上下文中有意义。我的猜测是以下可能有效:
User.joins(:role).where(roles: { name: 'Expert'})
您可能希望在scope
模型中定义User
,如下所示:
scope :experts, -> { joins(:role).where(roles: { name: 'Expert'}) }
比User.experts
将返回具有专家角色的所有用户。
答案 1 :(得分:0)
不是没有,但你的用户模型中有三种方法都设置了相同的字段,只是区别对待。
def role(role_type)
self.role.name = role_type
end
要获得正常工作所需的要求,您可以编写范围或方法。
def get_roles(role_type)
User.role.name = role_type
end
铁路指南总是非常有帮助。 http://guides.rubyonrails.org/active_record_querying.html#passing-in-arguments