2016-04-11 21 views
1

Model A, "diller" özelliğine sahiptir; bu, bir dizi "İngilizce", "Fransızca" gibi öğeleri içerir. Sitemin, kullanıcının bir dili seçmesine izin veren bir formu var ve "dilleri" bu dili içeren tüm nesneleri gösterecektir.Dizi özniteliği belirli bir dize içeren nesneleri bulmak için ransack kullanın.

Denetleyicimi nasıl tasarlayabilirim ve bunu nasıl yapabilirim? Dokümanlardan, bir öğenin başka bir şekilde değil, bir sorgu dizisinde olup olmadığını kontrol etmenin yolları vardır.

cevap

1

Bunu sadece another question numaralı telefondan yanıtladı, gelecekteki referanslar için de cevabı buraya ekleyeceğim.

# Gemfile 
gem 'postgres_ext' 

Ve bir başlatıcısı için bu ekleyin::

# 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 

Bundan sonra contains kullanmak mümkün olacak this issue tarihinde bahsedildiği gibi

projenize mücevher postgres_ext eklemem gerekiyor serileştirilmiş bir dizide.

tüm Öncelikle, modelde bir Kapsamı tanımlamak:

0

başka yolu da, belki daha kolay örneğin, kapsam ile

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

O ile argüman tanımlamak önemlidir *

İkinci Aynı modelde, ransack kullanım kapsamlarına izin veren özel bir yöntem tanımlamanız gerekir. Son adımda

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

search_form_for tanımlayın:

<%= 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 %> 

Bu kod Raylar 5. kodlama mutlu

olduğu;)