0

我有一个像这样的巨大复杂查询:

@objects = Object.joins({ x: :y }).includes(
  [:s, { x: { y: :z } }, { l: :m },:q, :w,
    { important_thing: 
      [:h, :v, :c,:l, :b, { :k [:u, :a] }]  
    }
  ]).where(conditions).order("x.foo, x.bar")

然后我想显示所有Objects并且只有Important_things在两个日期之间创建的。

如果我把它放在那里的where条款上,我不会得到所有,Objects只有在知情日期之间。ObjectsImportant_things

使用原始 sql 的解决方案是:

select * from objects left join important_things on important_things.object_id = objets.id and important_things.created_at between 'x' and 'y'

代替:

select * from objects left join important_things on important_things.object_id = objets.id where important_things.created_at between 'x' and 'y'

我真的需要所有这些对象,我不想使用原始 SQL、任何解决方法或将参数传递给ON关联子句的可能性?

4

2 回答 2

1

我这样做,

class VendorsRatings < ActiveRecord::Base

  def self.ratings(v_ids,sort = "DESC")

    joins("RIGHT OUTER JOIN vendors_lists v 
           ON v.vendor_id = vendors_ratings.vendor_id").where(conditions)

  end 

end
于 2013-03-15T20:42:11.700 回答
0

我做了一个丑陋的解决方法:

class Parent < ActiveRecord::Base
  cattr_accessor :dt_begin, dt_end
  has_many :children, conditions: Proc.new { { created_at: (@@dt_begin..@@dt_end) } }
end

class MetasController < ApplicationController
  def index
    Parent.dt_begin = Date.parse(param[:dt_begin])
    Parent.dt_end = Date.parse(param[:dt_end])

    @parents = Parent.includes(:children).where("children.age = ?", params[:age])
  end
end

因此,Parents即使我Children在这些指定日期之间没有 created_at,我也可以通过这种方式获得所有信息。

其中最重要的部分是 ActiveRecord 中的所有对象。

但要小心,因为我确实弄乱了 cattr_accessor 所以我每次搜索之前都必须设置Parents

于 2013-05-14T19:42:46.917 回答