2016-06-23 3 views
1

My railsアプリケーションにはUserモデルとRoleモデルがあります。各ユーザーは1つの役割に属し、各役割には多数のユーザーが存在します。ユーザーモデルには、そのユーザーの役割を確認するための3つのメソッドが定義されています。def admin?def user?、およびdef expert?データベースからのクエリがレールに返されない

Userクラス:

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 

は私だけexpert役割を持っているユーザーとcollection_selectを作成しようとしています。以下のような何か:

<%= collection_select(:keyword, :user_ids, User.where('expert?'), :id, :name, {prompt: true}, {:multiple => true}) %> 

しかし、それは方法としてexpert?認識しません。誰かがこのクエリを実行する方法を知っているかどうか疑問に思っていました。 これは私がレールに慣れていないので、素朴な質問であればごめんなさい。

何もしてくれてありがとう、 アミール

+0

User.where(役割:{名前: "expert"}) –

+0

'rails c'を起動し、この' User.last.expert? 'を試してみたらどうなりますか? –

+0

'User.last.expert?'はfalseを返し、 'User.last.admin? 'はそれが正しいことを意味するtrueを返します。 @KarimTarek – akargar

答えて

1

User.where('expert?')は本当に、データベースのための理にかなっていません:

SELECT * FROM users WHERE expert?; 

、明らかexpert?は、有効なSQL式ではありません。 expert?は、コードのコンテキストでのみ使用できます。

代わりに、有効なSQLに変換され、データベーススキーマのコンテキストで意味をなさない方法でそのロジックを記述する必要があります。私の推測では、次のように働くかもしれないということです。

User.joins(:role).where(roles: { name: 'Expert'}) 

このようにあなたは、あなたのUserモデルでscopeを定義することがあります:User.expertsより

scope :experts, -> { joins(:role).where(roles: { name: 'Expert'}) } 

は、専門家の役割を持つすべてのユーザーを返します。

+0

ありがとうございました。それは魅力的なように働きましたが、間違いなく私のSQL知識を向上させる必要があります。 – akargar

0

ないが、あなたはすべてがちょうど異なり、同じフィールドを設定し、ユーザーモデルの3つのメソッドを持っています。

def role(role_type) 
    self.role.name = role_type 
end 

希望するようにするには、スコープまたはメソッドのいずれかを作成します。

def get_roles(role_type) 
    User.role.name = role_type 
end 

レールガイドは常に非常に役立ちます。それは次のようにSQLに変換してしまうためhttp://guides.rubyonrails.org/active_record_querying.html#passing-in-arguments

関連する問題