来自数据库的查询在 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 所有具有专家角色的用户。