2016-04-11 3 views
1

Modell A hat Attribut "Sprachen", die ein Array enthält Element wie "Englisch", "Französisch". Meine Website hat ein Formular, mit dem der Benutzer eine Sprache auswählen kann und alle Objekte anzeigen, deren "Sprachen" diese Sprache enthalten.Verwenden Sie ransack, um Objekte zu finden, deren Array-Attribut eine bestimmte Zeichenfolge enthält

Wie entwerfe ich meinen Controller und sehe das an? In den Dokumenten können Sie prüfen, ob ein Element in einem Abfragearray ist, und nicht umgekehrt.

Antwort

1

Ich antwortete gerade auf another question, ich werde die Antwort hier auch für zukünftige Referenz hinzufügen.

Wie auf this issue diskutiert benötigen Sie den Edelstein postgres_ext zu einem Projekt hinzuzufügen:

# Gemfile 
gem 'postgres_ext' 

Und fügen Sie diese zu einem Initialisierer:

# config/initializers/ransack.rb 
Ransack.configure do |config| 
    %w[ 
    contained_within 
    contained_within_or_equals 
    contains 
    contains_or_equals 
    overlap 
    ].each do |p| 
    config.add_predicate p, arel_predicate: p, wants_array: true 
    end 
end 

Danach Sie contains nutzen können werden in einem serialisierten Array.

0

Eine weitere Möglichkeit, mehr vielleicht einfacher ist, mit Rahmen, zum Beispiel:

Zunächst alle, einen Bereich in Ihrem Modell definieren:

scope_languages_include, -> (*languages) {where("languages && '{#{languages.to_s.delete("[]")}}'")} 

Es ist wichtig, das Argument definieren mit *

Zweiter Im selben Modell müssen Sie eine private Methode definieren, die das Durchsuchen von Verwendungsbereichen ermöglicht.

def self.ransackable_scopes(auth_object = nil) 
    %w(lenguages_include) 
end 

Im letzten Schritt definieren den search_form_for:

<%= search_form_for @q, url: some_path do |f| %> 
    <% LANGUAGE::ALL.each do |lang| %> 
    <%= check_box_tag 'q[scope_languages_include][]', lang %> 
    <%= lang %> 
    <% end %> 
<% end %> 

Dieser Code ist in Schienen 5

glückliche Codierung;)

Verwandte Themen