SQL:
select * from user where room_id not in (select id from rooms);
这个sql在rails console
中的等效查询是什么?
例如:
User.all.each { |u| user.room }
(抱歉,但这个例子不正确。)
答案 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}
值得尝试,不是吗?