Ransack gem выбирает предикат и пользовательские имена предикатов
Я немного запутался в использовании расширенного поиска ransack. Я пытаюсь сделать собственный поиск, где не все имена таблиц могут быть выбраны в качестве условий поиска, а не все предикаты. Я использовал railscast в качестве учебника для этого, но я не могу найти ничего, как ограничить число предикатов. Существует ли также возможность использовать имена предикатов и полей таблицы на разных языках (только метки)?
Моя поисковая форма
= search_form_for @q, :url => search_offers_path, :html => { :method => :post } do |f|
= f.condition_fields do |c|
.field
= f.attribute_fields do |a|
= a.attribute_select
= f.predicate_select
= f.value_fields do |v|
= v.text_field :value
= link_to "#{t :destroy}", '#', class: "remove_fields"
= link_to_add_fields "#{t :add}", f, :condition
.field
= t :sort
= f.sort_fields do |s|
= s.sort_select
= f.submit "#{t :search}"
Мой контроллер
def index
select_offers = Offer.where { (user_id != id) & (ended == false) & ((created_at + life_time ) > DateTime.now) }
@q = select_offers.search(params[:q])
@offers = @q.result(:distinct => true).page(params[:page])
@q.build_condition
@q.build_sort if @q.sorts.empty?
end
Ответы
Ответ 1
Я нашел решение.
Чтобы изменить метки предиката, я использовал i18n.
en.yml
ransack:
asc: "ascending"
desc: "descending"
predicates:
cont: "contains"
not_cont: "not contains"
start: "starts with"
end: "ends with"
gt: "greater than"
lt: "less than"
...
Существует также возможность изменить имена полей атрибутов
attributes:
model_name:
model_field1: "field name1"
model_field2: "field name2"
...
Чтобы ограничить предикаты поиска вместо
= f.predicate_select
Я использовал
= f.attribute_fields do |a|
= a.attribute_select
= f.select :p, { 'custom predicate name1' => :predicate1, 'custom predicate name2' => :predicate2 }
Чтобы ограничить поля поиска таблицы, я добавил к модели
UNRANSACKABLE_ATTRIBUTES = ["id", "published", "created_at"]
def self.ransackable_attributes auth_object = nil
(column_names - UNRANSACKABLE_ATTRIBUTES) + _ransackers.keys
end
Ответ 2
Чтобы ограничить предикаты в помощнике формы predicate_select, вы можете передать массив как: only-option:
<%= f.predicate_select only: [:cont, :not_cont, :eq, :not_eq, :blank, :null, :not_null] %>
К сожалению, порядок элементов в переданном массиве не имеет значения, поэтому сортировка предикатов не работает таким образом.
Если вам не нравятся соединения (_any и _all) или даже не знают, для чего они хороши (как я), вы также можете передать: components-option:
<%= f.predicate_select compounds: false %>
Надеюсь, что это помогло. До сих пор Эрни делал много интересного и потрясающего материала, но их документация была своего рода липкой лентой: очень, очень тонкая, и вы застрянете, если попытаетесь взять ее в руки.