2016-06-23 4 views
1

내 레일 앱에 사용자 모델과 역할 모델이 있습니다. 각 사용자는 하나의 역할에 속하며 각 역할에는 많은 사용자가 있습니다. 해당 사용자의 역할을 확인하기 위해 사용자 모델에 정의 된 세 가지 방법이 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 

는 난 단지 expert 역할을 사용자와 collection_select을 만들려고하고 있습니다. 그러나이 방법으로 expert?을 인식하지 못하는

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

:처럼 뭔가. 아무도 내가이 쿼리를 어떻게 수행 할 수 있는지 궁금합니다. 레일스에 익숙하지 않은만큼 순진한 질문이라면 유감입니다.

감사합니다, 아미르 아무것도

+0

User.where (역할 : {name : "expert"})를 시도하면 어떻게됩니까? –

+0

'rails c'를 실행하고'User.last.expert? '를 시도하면 어떻게됩니까? –

+0

'User.last.expert?'는 false를 반환하고'User.last.admin? '은 true를 나타내는 true를 반환합니다. @KarimTarek – akargar

답변

1

User.where('expert?')은 정말, 데이터베이스에 대한 의미가 없습니다. 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

하지 않습니다,하지만 당신은 모든 단지 다르게, 같은 필드를 설정 사용자 모델의 세 가지 방법이있다.

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

원하는 작업을 올바르게 수행하려면 범위 또는 방법을 쓸 수 있습니다.

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

레일 가이드는 항상 매우 유용합니다.

SELECT * FROM users WHERE expert?; 

그리고 분명히 expert?가 유효한 SQL 표현되지 않습니다 : 그것은 같은 SQL로 번역 때문에 http://guides.rubyonrails.org/active_record_querying.html#passing-in-arguments

관련 문제