0

SQL:

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

rails console 与此 sql相同的等效查询是什么?

前任:

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

(对不起,这个例子不正确。)

4

3 回答 3

3

您几乎可以按字面意思翻译它:

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

where条款在接受什么方面非常灵活。

于 2012-04-09T14:06:56.543 回答
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 的 Active Record 查询NOT()。对该主题的搜索会返回一堆答案大致相同的 SO 问题。

你可以做类似的事情

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

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

于 2012-04-09T14:06:43.343 回答
0

不知道大家对squeel宝石有没有了解。它允许您在纯 Ruby 代码中构建非常复杂的 SQL 查询。在您的情况下,它应该像以下代码一样简单(gem 'squeel'在 Gemfile 中添加该行并运行bundle install):

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

值得一试,不是吗?

这是squeel 的页面

于 2012-04-09T19:21:20.930 回答