我有三张桌子: 产品,对象,信息 - 产品has_many对象通过Product_Objects ... 对象has_many信息,产品has_many信息。
我需要什么: 我想访问Info表中列的值。
我现在怎么做:
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表中的一个整数,列值。
谢谢
答案 0 :(得分:1)
您可以通过删除date
函数并使用pluck
而不是迭代所有记录来加快速度(假设value
是Info
模型上的列) 。为此,请在Info
模型上创建范围:
scope :created_at, ->(dates) { where(created_at: Array.wrap(dates).map {|date| date..(date + 1.day)}) }
然后你可以打电话:
data = @product.objects
data.infos.created_at(dates).where(product_id: @product.id).pluck(:value)
更新:
由于这两列位于不同的表中,因此您需要使用joins
方法。这使得使用上面定义的范围稍微复杂一些 - 我们需要使用merge。同时采用不允许在当时获得多个列,因此我们需要使用不错的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)