2012-09-21 11 views
10

Ich bin ein bisschen verwirrt mit der Verwendung einer erweiterten ransack Suche. Ich versuche eine benutzerdefinierte Suche durchzuführen, bei der nicht alle Tabellennamen als Suchbegriffe ausgewählt werden können und nicht alle Prädikate verwendet werden. Ich habe railscast als ein Tutorial für diese verwendet, aber ich kann nichts finden, wie die Anzahl der Prädikate zu begrenzen. Gibt es auch die Möglichkeit, die Namen von Preicates und Tabellenfeldern in verschiedenen Sprachen (nur Labels) zu verwenden?Ransack Gem wählen Prädikat und benutzerdefinierte Prädikat Namen

Mein Suchformular

= 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}" 

Mein Controller

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 

Antwort

18

ich eine Lösung gefunden zu haben. Um Prädikatsbeschriftungen zu ändern, habe ich i18n verwendet.

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" 
    ... 

Es gibt auch eine Möglichkeit, die Namen der Attribute zu ändern Felder

attributes: 
    model_name: 
    model_field1: "field name1" 
    model_field2: "field name2" 
    ... 

um die Suche zu begrenzen Prädikate statt

= f.predicate_select 

I verwendet

= f.attribute_fields do |a| 
    = a.attribute_select 
= f.select :p, { 'custom predicate name1' => :predicate1, 'custom predicate name2' => :predicate2 } 

zu Limit-Tabellensuche fi Felder hinzugefügt I

UNRANSACKABLE_ATTRIBUTES = ["id", "published", "created_at"] 

def self.ransackable_attributes auth_object = nil 
    (column_names - UNRANSACKABLE_ATTRIBUTES) + _ransackers.keys 
end 
+0

Fantastische Frage und Antwort, ein großes Lob daran, Da Sie scheinen vor kurzem tiefer in Ransack gegraben haben, Könnten Sie bitte einen Blick auf meine Frage: http://StackOverflow.com/Questions/13241481/Inform-Sorting -use-ransack-gem-nicht-arbeiten Ich könnte wirklich Hilfe gebrauchen, ich bin wirklich fest! Danke – jlstr

+0

Hallo, Entschuldigen Sie die Störung, wissen Sie, ob es eine Möglichkeit gibt, bestimmte Methoden im Array UNRANSACKABLE_ATTRIBUTES auszuschließen? Zum Beispiel möchte ich die Methoden ausschließen, die durch Beziehungen erstellt wurden. In meinem Fall gehört ein Produkt zu einem Produkttyp und der Produkttyp zeigt das Dropdown-Menü an. Gibt es eine Möglichkeit, es zu entfernen? Danke im Voraus! – jlstr

+0

Sie können alle Prädikate hier überprüfen: https://github.com/activerecord-hackery/ransack/blob/master/lib/ransack/constants.rb –

8

Um Grenze zu modellieren die Prädikate in der predicate_select Form Helfer Sie ein Array als passieren kann: only-Option:

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

Leider ist das Element, um in dem übergebenen Array doesn 't Angelegenheit überhaupt so Sortierung der Prädikate funktioniert nicht auf diese Weise.


Wenn Sie nicht wie die Verbindungen (_any & _all) oder nicht einmal wissen, was sie gut sind (wie ich), die Sie auch passieren können: Verbindungen-Option:

<%= f.predicate_select compounds: false %> 

Hoffnung, die geholfen hat. Ernie hat bis jetzt viele interessante und erstaunliche Sachen gemacht, aber ihre Dokumentationen sind eine Art Klebeband: sehr, sehr dünn und du wirst feststecken, wenn du versuchst, es in die Finger zu bekommen.

+1

Vielen Dank für die Erklärung der Verbindungen! – daveomcd

+0

Endlich - ich kann die vergifteten Verbindungen töten! – ineedahero