来自数据库的查询不会在rails中返回

时间:2016-06-23 16:50:17

标签: ruby-on-rails ruby ruby-on-rails-3 rails-activerecord

我的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。

谢谢, 阿米尔

2 个答案:

答案 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