10

我对使用高级洗劫搜索有点困惑。我正在尝试进行自定义搜索,其中并非所有表名都可以选择作为搜索词,并且并非所有谓词都被使用。我使用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
4

2 回答 2

19

我找到了解决方案。为了更改谓词标签,我使用了 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
于 2012-09-28T13:04:20.767 回答
8

限制 predicate_select表单助手中的谓词,您可以将数组作为 :only-option 传递:

<%= f.predicate_select only: [:cont, :not_cont, :eq, :not_eq, :blank, :null, :not_null] %>

不幸的是,传递数组中的元素顺序根本不重要,因此对谓词进行排序不能以这种方式工作。


如果你不喜欢这些化合物 (_any & _all)或者甚至不知道它们有什么用处(就像我一样),你也可以通过 :compounds-option:

<%= f.predicate_select compounds: false %>

希望有帮助。到目前为止,Ernie 做了很多有趣和令人惊叹的事情,但他们的文档有点像胶带:非常非常薄,如果你试图拿到它,你会被卡住。

于 2013-01-10T01:02:31.667 回答