Что-то в этом духе может сработать, но вы не знаете, как эти цепочки плохо влияют на производительность или результаты, но вы можете попробовать это и привести к желаемому ответу
ОБНОВЛЕНО
Если вы действительно хотите цепочку, это близко к тому, что вы хотите.
class DocumentRepository < Hanami::Repository
GENRES = DbSchema.current_schema.enum(:document_genre).values.map(&:to_s)
DOCUMENTS_PER_PAGE = 30
associations do
has_many :boxes
has_many :urls
end
attr_accessor :data
def initialize
@data = []
super
end
def data
@data.flatten!.uniq!
end
def with_genre(key)
@data << documents.where(genre: key)
self
end
def published_between(arr)
from, to = arr
@data << documents.where(created_at: [from..to])
self
end
def skip(num)
@data << documents.offset(num)
self
end
end
Назовите это так, если предположить, что это переменная экземпляра DocumentRepository
document_repository.with_genre('news')
.published_between([from, to])
.skip(30)
.data
Возвращая self
в каждом методе экземпляра вы можете объединить вызовы в экземпляре.
Оригинальный ответ
Этот способ работает, но использует аналогичный синтаксис в текущем вызове.
class DocumentRepository < Hanami::Repository
GENRES = DbSchema.current_schema.enum(:document_genre).values.map(&:to_s)
DOCUMENTS_PER_PAGE = 30
associations do
has_many :boxes
has_many :urls
end
def hack_where(opts={})
data = []
opts.each do |i|
data << self.send(i[0],i[1]).call
end
data.flatten!.uniq!
end
def with_genre(key)
lambda { |key| documents.where(genre: key) }
end
def published_between(arr)
from = arr[0]
to = arr[1]
lambda { |from, to| documents.where(created_at: [from..to]) }
end
def skip(num)
lambda { documents.offset(num) }
end
end
Вы можете назвать это как:
hack_where({with_genre: 'news', published_between: [from,to], skip: 30})