2012-12-31 2 views
3

이것은 우려와 범위를 이해하려고하는 레일 멍청한 사람의 질문입니다.레일스 클래스 또는 인스턴스 메소드의 스코프입니까?

난 항상 생각 스코프는 레일 클래스 메소드 있었다하지만 저번에 내가 this code from DHH을 보았다 :

는 그래서 visible 방법을 사용하는 방법과 같이이다
module Visible 
    extend ActiveSupport::Concern` 

    module ClassMethods 
    def visible_to(person) 
     where \ 
     "(#{table_name}.bucket_id IN (?) AND 
      #{table_name}.bucket_type = 'Project') OR 
     (#{table_name}.bucket_id IN (?) AND 
      #{table_name}.bucket_type = 'Calendar')", 
     person.projects.pluck('projects.id'), 
     calendar_scope.pluck('calendars.id') 
    end 
    end 
end 

:

current_account.posts.visible_to(current_user)

이것은 나를 혼란스럽게합니다. Self 여기에 게시물 모음이 있으므로 인스턴스에 대해 작업하고 있지만 보이는 메서드는 클래스 메서드로 사용해야합니다. 데이비드가 클래스 메서드를 동적 범위로 호출하려고하지 않습니까? 누군가 명확히 해 주실 수 있습니까?

답변

3

ActiveRecord :: Base를 상속 한 클래스의 클래스 메서드는 범위로도 사용할 수 있습니다 (ActiveRecord 관계 개체에서).

Visible 모듈은 ActiveRecord :: Base를 상속 한 모델에 혼합되어 있기 때문에 클래스 메서드 visible_to를 범위로 사용할 수 있습니다. 이 문제가 해결되지 않은 경우

, 당신은 다음과 같은 방법으로 모든 성인 사용자 (나이> 20)을 유도 할 수있는 범위를 구현할 수 있습니다

class User < ActiveRecord::Base 
    scope :adult, lambda { where("age > ?", 20) } # with a scope 

    class << self 
    def adult # with class method 
     where("age > ?", 20) 
    end 
    end 
end 

을 그리고 User.adult

+0

와 정확히 같은를 사용 그래서 스코프는 실제로 activerecord 객체에 작용하며 클래스에 보낼 수있는 메시지로도 사용할 수 있습니다. 그 맞습니까? –

+0

나는 정말로이 질문을 이해하지 못한다. 당신이 명확히 할 수 있습니까? –

+0

스코프를 사용하여 모델 클래스뿐만 아니라 레코드에서도 작동 할 수 있습니까? –

관련 문제