ruby/rails范围内的原始SQL
我想了解以下两个版本的rails scope之间的区别。我相信它们的功能是一样的。但是,当使用这两种方法时,我发现生成的SQL有很多不同ruby/rails范围内的原始SQL,sql,ruby-on-rails,ruby,rails-activerecord,Sql,Ruby On Rails,Ruby,Rails Activerecord,我想了解以下两个版本的rails scope之间的区别。我相信它们的功能是一样的。但是,当使用这两种方法时,我发现生成的SQL有很多不同 版本1(原始SQL) 第2版 scope :ignore_unavailable, lambda { ids = Cars.select("id").where("status = 'NA'"); idsStr = '' idsarr = ids.collect{|car| car.id}.flatten where(["Item.id not in ("
版本1(原始SQL)
第2版
scope :ignore_unavailable, lambda {
ids = Cars.select("id").where("status = 'NA'");
idsStr = ''
idsarr = ids.collect{|car| car.id}.flatten
where(["Item.id not in (" + idsarr.join(",") + ")"])
}
在我看来,版本2比版本1生成的查询更优化,但我不明白为什么会这样。
有人能解释一下这里会发生什么吗?为什么您认为它更优化?如果您已经将一个db查询转换为2,为什么要混合项目和车辆id?它们之间有关系吗?这只是正在使用的众多作用域之一。到目前为止,我真的不知道为什么我使用V2时性能非常好,而使用V1时,我可以看到生成了大量额外的SQL,因此性能也会下降。请添加一个示例,说明每个版本生成的查询。它们应该在日志中。另外,即使是第二个版本也包含过多的SQL。超出了应有的范围。我已经在
scope :ignore_unavailable, lambda {
ids = Cars.select("id").where("status = 'NA'");
idsStr = ''
idsarr = ids.collect{|car| car.id}.flatten
where(["Item.id not in (" + idsarr.join(",") + ")"])
}