加入关联表

时间:2014-01-13 12:29:23

标签: ruby-on-rails activerecord ruby-on-rails-4

我有三张桌子: 产品,对象,信息 - 产品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表中的一个整数,列值。

谢谢

1 个答案:

答案 0 :(得分:1)

您可以通过删除date函数并使用pluck而不是迭代所有记录来加快速度(假设valueInfo模型上的列) 。为此,请在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)