我试图从同一模型上的几个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
,迭代每个并添加我想要的内容。对于大型模型而言,这将非常耗时。还有更好的方法吗?
答案 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关系集合。