SQL:
select * from user where room_id not in (select id from rooms);
rails console
与此 sql相同的等效查询是什么?
前任:
User.all.each { |u| user.room }
(对不起,这个例子不正确。)
SQL:
select * from user where room_id not in (select id from rooms);
rails console
与此 sql相同的等效查询是什么?
前任:
User.all.each { |u| user.room }
(对不起,这个例子不正确。)
您几乎可以按字面意思翻译它:
User.where('room_id not in (select id from rooms)').all
该where
条款在接受什么方面非常灵活。
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) }
但这可能会再次降低效率。
不知道大家对squeel
宝石有没有了解。它允许您在纯 Ruby 代码中构建非常复杂的 SQL 查询。在您的情况下,它应该像以下代码一样简单(gem 'squeel'
在 Gemfile 中添加该行并运行bundle install
):
room_ids = Room.select{id}; User.where{room_id.not_in room_ids}
值得一试,不是吗?
这是squeel 的页面。