這種奇怪的行爲是由於ActiveRecord對範圍的懶惰評估。 會發生什麼是該行
@dropdown_channels = @dropdown_channels.where(:id => channel.id)
不將查詢發送到數據庫,直到你實際使用的@dropdown_channels
值,當你做它加到所有條件成一個大的查詢,這就是爲什麼你AND之間的條件。
爲了強制ActiveRecord的躍躍欲試負載,可以使用的範圍無論是all
範圍或first
範圍,例如:
@dropdown_channels = @dropdown_channels.where(:id => channel.id).first
這將迫使ActiveRecord的計算查詢現貨立即返回結果而不是積累懶惰評估的範圍。
另一種方法可以是累積所有這些channels_ids,並稍後在一個查詢中獲取它們,而不是對每個查詢進行查詢。這種方法與數據庫資源相關的成本效益更高。 爲了實現這一點:
dropdown_channels_ids = []
@channels.each do |channel|
unless @guide_channels.where(:id => channel.id).exists?
dropdown_channels_ids << channel.id
end
end
@dropdown_channels = @dropdown_channels.where(:id => dropdown_channels_ids)
糾正我,如果我錯了'@dropdown_channels = @ dropdown_channels.where(:id => channel.id)'是否正確指派你分配/重新分配每個塊內的'dropdown_channels'是否正確糾正我如果我錯了 – Viren
1)爲什麼使用Ruby的呢?看起來有些事要做AR查詢2)'x = x.method'通常是一個壞主意 – tokland
我同意tokland,似乎它會更整潔/更高效的一個很好的連接查詢。你能否提供更多關於你的模型的信息以及你的目標是什麼? – Ant