Цепочка ActiveRecord_Relation в PORO - PullRequest
       10

Цепочка ActiveRecord_Relation в PORO

0 голосов
/ 09 ноября 2018

В приложении Rails 5.1 у меня есть объект запроса (PORO) с именем CoolProducts.

class CoolProducts
  def self.call(relation = Product.all)
  ...
  # return an instance of Product::ActiveRecord_Relation
  end
end

Теперь мне нужно ограничить количество найденных Product с учетом того, что nameсоответствует string.

Следующие работы

CoolProducts.call.where("name ILIKE ?", "%#{string}%")

Однако я хотел бы инкапсулировать соответствующий логин в классе CoolProducts, что позволяет сделать что-то вроде

CoolProducts.call.including_in_name(string)

Но я не уверен, с чего начать.Есть идеи?

1 Ответ

0 голосов
/ 09 ноября 2018

Будет трудно, если вы хотите, чтобы любой из ваших методов был цепным, или возвращал ActiveRecord :: Relation.

Если вы рассматриваете возможность явной выборки записей, когда закончите с цепочкой, то все должно работать:

class CoolProducts
  def initialize(relation)
    @relation = relation
  end

  def self.call(relation = Product.all)
    new(relation).apply_scopes
  end

  attr_reader :relation
  alias_method :fetch, :relation

  def including_in_name(string)
    tap { @relation = relation.where("name ILIKE ?", string) }
  end

  def apply_scopes
    tap { @relation = relation.where(price: 123) }
  end
end

Использование:

CoolProducts.call.including_in_name(string).fetch
...