2016-03-20 19 views
0

Tablonun bir sütunu, json biçiminde bir dizi dizeden oluşur. ActiveRecord'u, sağlanan dizide aynı öğelerle eşleşen veya bunlardan oluşan bir dizi olan tüm kayıtları döndürmek için nasıl kullanacağımı bilmek istiyorum. ÖrneğinBir kayıttaki bir diziyi eşleştirmek için ActiveRecord'u kullanma

: SQL kısmında ActiveRecord ile seri veri aranıyor

flag.colors = ['red', 'blue', 'green'] 
query = ['blue', 'red', 'green'] 

Flag.where('colors matches query') #=> flag 
+0

Hangi veritabanı? "Json biçimindeki dizeler dizisi" ile "varchar" veya "text" sütununda JSON mu demek istiyorsunuz yoksa veritabanınızın yerel JSON desteğini mi kullanıyorsunuz? –

+0

PostgreSQL kullanıyorum, ancak yerel JSON desteğini kullanmam (bazı hatalar vardı), veri türü String'dir, ancak Ruby'de bir diziye getirmek için JSON.parse yöntemini kullanacaktır. İdeal değil, şimdi farkettim ... – exchez

+0

JSON'nuz sadece bir dizi dizgiden oluştuğu için şemayı bir 'text [] 'sütunu kullanmak için yeniden işleyebilir misiniz? Dizi sütunları ActiveRecord ile düzgün çalışmalıdır. –

cevap

2

mümkün olmayacaktır. Bununla birlikte Ruby'de filtreleyebilirsiniz:

flag.colors = ['red', 'blue', 'green'] 
query = ['blue', 'red', 'green'] 

Flag.all.select{|f| f.colors.sort == query.sort} #=> [flag] 

PostgreSQL'i kullanırken, aslında daha iyi bir yol var. PG yerel Array'ı destekler. Sen göçün etkinleştirebilirsiniz:

create_table :flags do |t| 
    t.text :tags, array: true 
end 

Sonra basitçe arayın:

query = ['blue', 'red', 'green'] 

#With Overlap operator: 
Flag.where.overlap(tags: query) 

#or with Contains Operator 
Flag.where.contains(tags: query) 

Burada daha ayrıntılı bilgi here bulabilirsiniz.

+0

teşekkürler, bu çok yardımcı oldu! – exchez

İlgili konular