2012-12-31 26 views
3

這是來自rails noob嘗試理解問題和範圍的問題。範圍是否在rails類或實例方法中?

我一直以爲範圍是在軌道類的方法,但隨後有一天,我看到了this code from DHH

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 

因此使用visible方法的方法是像這樣:

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

我可以使用範圍作爲整體對記錄以及模型類進行操作? –

相關問題