我对使用高级搜索搜索感到困惑。我正在尝试进行自定义搜索,其中不能选择所有表名作为搜索项,也不会使用所有谓词。我使用railscast作为教程,但我找不到任何限制谓词数量的方法。是否有可能使用不同语言(只是标签)的preicates和table字段的名称?
我的搜索表单
= 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
答案 0 :(得分:18)
我找到了解决方案。 要更改谓词标签,我使用了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
答案 1 :(得分:8)
要限制谓词_select 表单助手中的谓词,您可以将数组传递为:only-option:
<%= f.predicate_select only: [:cont, :not_cont, :eq, :not_eq, :blank, :null, :not_null] %>
不幸的是,传递数组中的元素顺序根本不重要,因此排序谓词不起作用。
如果您不喜欢化合物(_any&amp; _all)或者甚至不知道它们对我们有什么好处(我),您也可以传递:compounds-option:< / p>
<%= f.predicate_select compounds: false %>
希望有所帮助。到目前为止,厄尼做了许多有趣和令人惊奇的事情,但他们的文件有点胶带:非常非常薄,如果你试图抓住它,你就会陷入困境。