Rails 3.2并获得AR以正确地订购此查询

时间:2012-04-30 05:06:51

标签: sql ruby-on-rails activerecord

我目前有一个范围,我试图找到在关联中创建的最后一条记录,并在特定布尔值为假时选择它

IE Foo has_many Bar's和Bar's有一个名为bazzed的布尔列

scope :no_baz,   joins(:bars).order("bars.id DESC").limit(1).where("bars.bazzed = 'f'")

这个问题是rails将此查询转换为类似

的内容
SELECT "foos".* FROM "foos" INNER JOIN "bars" ON "bars"."foo_id" = "foos"."id" WHERE (bars.bazzed = 'f') ORDER BY bars.id DESC LIMIT 1

问题在于rails正在调用order并限制在where子句之后,我正在寻找的是先执行命令并限制首先尝试找到最后一个被设置为false的bar。

是否有原生的AR方式来执行我试图完成的查询?

修改

我正试图抓住那个有一个酒吧的foo,他们所拥有的最后一个酒吧已经被设置为假,并且只有当那个foo的最后一个酒吧有一个虚假的bezzed。

2 个答案:

答案 0 :(得分:1)

好的,我建议在“foo”模型上查询:

Foo.bars.where("bars.bazzed = ?", 'f').all( :order => "created_at DESC").first

注意:'f'可以替换为false,当然,这取决于您在“bazzed”列中使用的值。

[编辑]

好的,我认为我更好地理解了这个问题,这里有一个建议,但对于公共方法而不是范围查询。

def no_baz
  all_no_baz_foos = Array.new
  Foo.all.each do |foo|
      last_bar = foo.bars.all.order("bars.id DESC").first
      if last_bar.bazzed == 'f'
        all_no_baz_foos << foo
      end
  end
  return all_no_baz_foos
end

此方法将返回一个包含所有no_baz_foos记录的数组。由于我没有测试我的代码,你可能不得不改变一些工作,但我认为你明白了。

对于“范围”方法,我找不到一种方法来正确链接查询以获得所需的结果。如果其他人知道如何使用示波器实现这一点,我也很高兴听到解决方案。

答案 1 :(得分:0)

现在使用类方法,但问题在于它返回一个数组对象,而不是我想要返回的活动记录关系。仍在尝试正确完成查询。