我目前有一个范围,我试图找到在关联中创建的最后一条记录,并在特定布尔值为假时选择它
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。
答案 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)
现在使用类方法,但问题在于它返回一个数组对象,而不是我想要返回的活动记录关系。仍在尝试正确完成查询。