Фильтр по нескольким ключам hstore в активном админе

Я пытаюсь добавить настраиваемое поле фильтра для hstore поле.

В активадмин: filter :by_title, label: 'Title', as: :string

В модели:

ransacker :by_title do |parent|
  Arel::Nodes::InfixOperation.new('->', 
  parent.table[:title_translations], Arel::Nodes.build_quoted('en'))
end

Этот код выполняет поиск, создавая правильный запрос в зависимости от выбора activeadmin (содержит, равно, начинается_ с или заканчивается_ с)

Я использую hstore для хранения заголовков для нескольких локалей. Я хотел бы искать во всей локали. Не только en, но fr, es, ru, так далее

1 ответ

Решение

В итоге я использовал пользовательскую область видимости так:

# Ransackable Scopes
def self.ransackable_scopes(_auth_object = nil)
  [:by_title]
end

# My scopes
scope :by_title, ->(search_term) { by_field(search_term, :title) }

scope :by_field, lambda { |search_term, field|
  where("#{field}_translations -> :key ILIKE :value", key: :en, value: "%#{search_term}%")
    .or(where("#{field}_translations -> :key ILIKE :value", key: :fr, value: "%#{search_term}%"))
    .or(where("#{field}_translations -> :key ILIKE :value", key: :de, value: "%#{search_term}%"))
}

Он не совсем отвечает на вопрос, но это было решение, которое помогло мне.

Другие вопросы по тегам