метод экземпляра в области видимости - PullRequest
6 голосов
/ 01 июня 2011

Я не знаю, даже если это возможно?Мне нужно использовать метод экземпляра с / в рамках.Примерно так:

scope :public, lambda{ where ({:public => true}) }

и вызов метода экземпляра (complete?) Для каждой записи, чтобы увидеть, завершена ли она.Здесь публичная область должна возвращать все записи, которые являются открытыми и завершены, и завершение записи определяется методом экземпляра 'complete?'

Любая возможность?

Спасибо

Ответы [ 2 ]

11 голосов
/ 01 июня 2011

Области предназначены для генерации логики запросов с использованием ARel.Если вы не можете представить логику полного?метод в SQL, то вы как бы застряли

Области - по крайней мере в рельсах 3 - предназначены для объединения логики запроса без возврата набора результатов.Если вам нужен набор результатов для полного тестирования, вам нужно сделать что-то вроде

class MyModel < ActiveRecord::Base
  scope :public, lambda{ where ({:public => true}) }

  def self.completed_public_records
    MyModel.public.all.select { |r| r.completed? }
  end
end

# elsewhere
MyModel.completed_public_records

или если вам нужна большая гибкость

class MyModel < ActiveRecord::Base
  scope :public, lambda{ where ({:public => true}) }
  # some other scopes etc


  def self.completed_filter(finder_obj)
    unless finder_obj.is_a?(ActiveRecord::Relation)
      raise ArgumentError, "An ActiveRecord::Relation object is required"
    end
    finder_obj.all.select { |r| r.completed? }
  end
end

# elsewhere
MyModel.completed_filter(MyModel.public.another_scope.some_other_scope)
0 голосов
/ 17 апреля 2014

Я создал рубин для этой проблемы несколько месяцев назад, когда у меня была такая же проблема.

Позволяет добавлять методы, которые работают с результирующим набором запроса, но абстрагирует методы в другой класс, чтобы он не мешал вашей модели.

Проверьте это: https://github.com/coryodaniel/collectively

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...