使用rails

时间:2017-03-03 23:36:05

标签: ruby-on-rails

我试图从同一模型上的几个SQL填充活动记录集合。 SQL之间唯一不同的是where子句。我的模型有一个type_id。作为一个例子,我有

models = Model.where("type_id = ?", 1)
logger.debug 'models.count ' + models.count.to_s  
m = Model.where("type_id = ?", 2)
models << m
logger.debug 'models.count ' + models.count.to_s  

从那以后,我的日志文件显示了我

SELECT COUNT(*) FROM "models"  WHERE (type_id = 1)
models.count 1
SELECT COUNT(*) FROM "models"  WHERE (type_id = 1)
models.count 1

第二个SQL对我的情况不正确,我想要

SELECT COUNT(*) FROM "models"  WHERE (type_id = 2)

我发现解决此问题的唯一方法是执行Model.all,迭代每个并添加我想要的内容。对于大型模型而言,这将非常耗时。还有更好的方法吗?

2 个答案:

答案 0 :(得分:1)

从它的声音中,你正在寻找任何Model的{​​{1}}为1或2.在SQL中,你会将其表达为IN子条款:

type_id

在Rails中,您可以将一组可接受的值传递给SELECT * FROM models WHERE type_id IN (1, 2); 调用以生成SQL IN语句:

where

答案 1 :(得分:1)

正如@ArtOfCode所说,你想要的是一次通过查询。话虽这么说,你在那里尝试做什么是行不通的,因为当你将第二个查询的对象<<添加到第一个查询时,你只是将实例附加到第一个集合。生成的查询的对象类型是ActiveRecord_Relation,它恰好包含自定义模型的两个实例(在本例中为Model,但是当您发送/调用{{1}时那就是实际执行count查询。

你怎么能分辨出来?好吧,如果您运行了您使用过的代码,那么:

ActiveRecord

你会看到,对models.count 你所做的查询条件执行了SQL,但是,如果这样做:

models

您会注意到结果是models.length ,原因是因为恰好位于2内的您自己对象的集合长度确实是两个,这就是发生的事情如果你使用ActiveRecord_Relation;它会将对象实例添加到关系中,但这并不意味着它们是查询的一部分。

你甚至可以这样做:

<<

调用models << Model.new 将有效地返回3,因为这是关系中包含的模型实例的数量,同样不是查询的一部分。因此,您可以看到甚至可以添加尚未保存到数据库的新对象实例。

TL; DR 如果要查询存储在数据库中的对象,请在查询本身或链条件上查询,但不要尝试混合activerecord关系集合。