来自数据库的查询在 rails 中不 return
Query from database does not return in rails
我的 rails 应用有一个用户模型和一个角色模型。每个用户属于一个角色,每个角色有多个用户。用户模型中定义了三种方法来检查该用户的角色 def admin?
、def user?
和 def expert?
.
用户class:
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:
class Role < ActiveRecord::Base
has_many :users
end
我正在尝试仅与具有 expert
角色的用户一起创建 collection_select
。类似于:
<%= collection_select(:keyword, :user_ids, User.where('expert?'), :id, :name, {prompt: true}, {:multiple => true}) %>
但它不识别 expert?
作为方法。我想知道是否有人知道我该如何执行此查询。
如果这是一个天真的问题,我很抱歉,因为我是 rails.
的新手
谢谢,
阿米尔
不是没有原因的,但是您的用户模型中有三种方法都设置相同的字段,只是不同而已。
def role(role_type)
self.role.name = role_type
end
为了让你想要的 require 正常工作——你可以编写一个范围或一个方法。
def get_roles(role_type)
User.role.name = role_type
end
铁路指南总是非常有帮助。 http://guides.rubyonrails.org/active_record_querying.html#passing-in-arguments
User.where('expert?')
对数据库没有意义,因为它会转换为 SQL,例如:
SELECT * FROM users WHERE expert?;
显然 expert?
不是有效的 SQL 表达式。 expert?
仅在您的代码上下文中可用。
相反,您需要以转换为有效 SQL 并且在数据库模式上下文中有意义的方式编写该逻辑。我的猜测是以下可能有效:
User.joins(:role).where(roles: { name: 'Expert'})
您可能想在 User
模型中定义一个 scope
,如下所示:
scope :experts, -> { joins(:role).where(roles: { name: 'Expert'}) }
比 User.experts
return 所有具有专家角色的用户。
我的 rails 应用有一个用户模型和一个角色模型。每个用户属于一个角色,每个角色有多个用户。用户模型中定义了三种方法来检查该用户的角色 def admin?
、def user?
和 def expert?
.
用户class:
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:
class Role < ActiveRecord::Base
has_many :users
end
我正在尝试仅与具有 expert
角色的用户一起创建 collection_select
。类似于:
<%= collection_select(:keyword, :user_ids, User.where('expert?'), :id, :name, {prompt: true}, {:multiple => true}) %>
但它不识别 expert?
作为方法。我想知道是否有人知道我该如何执行此查询。
如果这是一个天真的问题,我很抱歉,因为我是 rails.
谢谢, 阿米尔
不是没有原因的,但是您的用户模型中有三种方法都设置相同的字段,只是不同而已。
def role(role_type)
self.role.name = role_type
end
为了让你想要的 require 正常工作——你可以编写一个范围或一个方法。
def get_roles(role_type)
User.role.name = role_type
end
铁路指南总是非常有帮助。 http://guides.rubyonrails.org/active_record_querying.html#passing-in-arguments
User.where('expert?')
对数据库没有意义,因为它会转换为 SQL,例如:
SELECT * FROM users WHERE expert?;
显然 expert?
不是有效的 SQL 表达式。 expert?
仅在您的代码上下文中可用。
相反,您需要以转换为有效 SQL 并且在数据库模式上下文中有意义的方式编写该逻辑。我的猜测是以下可能有效:
User.joins(:role).where(roles: { name: 'Expert'})
您可能想在 User
模型中定义一个 scope
,如下所示:
scope :experts, -> { joins(:role).where(roles: { name: 'Expert'}) }
比 User.experts
return 所有具有专家角色的用户。