2016-03-22 20 views
0

Sorgulama yapılırken ActiveRecord, sütun türüne göre aralıkların, dizilerin, vb. Nasıl işleneceğini otomatik olarak kararlaştırır.ActiveRecord içinde sorgulamak için nasıl/yeni bir tür kaydedebilirim?

Şimdi yapmak istediğim, Model.where(bitfield: [1,4,16,32]).count gibi bir şey çağırarak bir bit değerleri kümesi için bir tamsayı sütunu sorgulamaktır; burada, bu bitlerden en az birine sahip olan tüm nesneleri saymak buna göre bir sorgu oluşturacaktır.

Elde edilen SQL'i nasıl kuracağımı biliyorum, temel olarak sütun türünü kontrol edecek kodumu koyacağım bir yer arıyorum, bitfield olarak yapılandırıldığımı buldum ve ilgili aracı oluşturmak için işleyicimi kullanıyorum SQL parçaları.

+1

... saklayıcısında farkında olan Modelinizdeki bir bit_where yöntemi yapmak için iyi anlamak için emin olacaktır ama ActiveRecord geçersiz kılarak kendi tamsayı türü oluşturabilirsiniz: : Type :: Bitfield modelinde tamsayı yöntemleri. Ardından, modellerde her özellik türünü şu şekilde ayarlayabilirsiniz: 'attribute: int_var, Bitfield.new'. Özel sorgu için bunu nasıl yapacağımı bilmiyorum :). – rdupz

+0

Ah, bu iyi bir işaretçidir. Belki de sorgulama mantığını tip rotanın herhangi bir yerinde bulabilirim. – CMW

cevap

1

Benim ilk düşünce, Hey

class Model << ActiveRecord::Base 

    BITFIELDS = [:bitfield] 

    def self.bit_where(*args, options={}) 
    bitfield_options = {} 
    options.each do |k, v| 
    if BITFIELDS.include?(k) 
     bitfield_options[k] = v 
     options.delete(k) 
    end 
    end 
    collection = self.where(*args, options) # the regular "where" query 
    bitfield_options.each do |k, v| 
    ... collection.where(custom sql here based on each key, value) 
    end 
    collection 
end 
+0

Muhtemelen buraya gideceğim, evet. Hala keşif için gizli bir takılabilir yapı bulmayı umuyoruz. – CMW

+0

Yöntemi, model/kaygılarla ilgili kaygılara ekleyebilir ve ardından, ilgili tüm modellerde endişeye yer verebilirsiniz. – SteveTurczyn

İlgili konular