3

これは、懸念事項と範囲を理解しようとしているRailsnoobからの質問です。

スコープはRailsのクラスメソッドだといつも思っていましたが、先日、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これは投稿のコレクションであるため、インスタンスを操作していますが、visibleメソッドはクラスメソッドとして使用されることを意図しているようです。davidはクラスメソッドを動的スコープとして呼び出そうとしていませんか?誰かが明確にしてくれませんか?

4

1 に答える 1

3

ActiveRecord::Base を継承するクラスのクラス メソッドは、(ActiveRecord Relation オブジェクトの) スコープとしても使用できます。

モジュール 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

于 2012-12-31T09:44:25.103 に答える