与这个sql在`rails console`中的相同等价查询是什么?

时间:2012-04-09 13:46:25

标签: sql ruby-on-rails

SQL:

select * from user where room_id not in (select id from rooms);

这个sql在rails console中的等效查询是什么?

例如:

User.all.each { |u| user.room }

(抱歉,但这个例子不正确。)

3 个答案:

答案 0 :(得分:3)

你几乎可以翻译它:

User.where('room_id not in (select id from rooms)').all

where子句在接受的内容方面非常灵活。

答案 1 :(得分:2)

User.where("room_id not in (select id from rooms)")

但是你想要这个,因为它会更快:

User.where("not exist (select id from rooms where id=users.room_id)")

这是你能得到的最接近的。似乎无法创建转换为SQL NOT()的Active Record查询。对该主题的搜索会返回一堆具有相同答案的SO问题。

您可以执行类似

的操作
User.all.select { |u| !Room.find_by_id(u.room_id) }

但这可能会再次降低效率。

答案 2 :(得分:0)

我不知道你是否熟悉squeel宝石。它允许您在纯Ruby代码中构建非常复杂的SQL查询。在您的情况下,它应该像下面的代码一样简单(在Gemfile中添加gem 'squeel'行并运行bundle install):

room_ids = Room.select{id}; User.where{room_id.not_in room_ids}

值得尝试,不是吗?

这是squeel's page