2014-01-13 259 views
0

我有三個表: 產品,對象,信息 - 產品has_many通過Product_Objects的對象... 對象has_many信息,產品has_many信息。關聯關聯表

我需要什麼: 我想訪問信息表中的列中的值。

我現在該怎麼做:

data = @product.objects 
data.infos.where('date(created_at) IN (?)', dates).where(product_id: @product.id).each do |d| 
    d.value 
end 

(日期:Date.today,Date.today - 1.day,Date.today - 1.week,Date.today - 1.month)

有沒有辦法改變這種情況,因爲我有很多記錄,而且速度很慢。

預期結果:[名稱,值] Name是Object表中的列,value是Info表中列值的整數。

謝謝

回答

1

你可以擺脫date功能,並通過使用pluck,而不是遍歷所有記錄加快速度(假設valueInfo模型列)。

scope :created_at, ->(dates) { where(created_at: Array.wrap(dates).map {|date| date..(date + 1.day)}) } 

然後就可以調用:要做到這一點,就Info模型創建範圍

data = @product.objects 
data.infos.created_at(dates).where(product_id: @product.id).pluck(:value) 

UPDATE:

由於這兩列都在單獨的表,你將需要使用joins方法。這使得使用上面定義的範圍有點棘手 - 我們需要使用合併。動物內臟也沒有允許的時候獲得超過一列,所以我們需要用漂亮的select_all招:

data = @product.objects 
query = data.joins(:infos).merge(Info.created_at(dates)).where(product_id: @product.id).select([:name, :value]) 
ActiveRecord::Base.connection.select_all(query) 
+0

這會工作,如果我僅環中的數據。 – John

+0

你能描述一下「價值」是什麼 - 它看起來不是專欄? – BroiSatse

+0

該值是一個整數,並且是info表中的一列 – John