例如,我有2个表:主题和评论。
主题has_many评论。评论belongs_to主题。
评论表有列sender_id,我保存用户的id,谁创建此评论。
任务:选择主题的ID,这个用户没有评论(我知道user_id)。 (我想用一个查询来做)。
早些时候我这样做了。 (两个查询)(我的数据库 - PostgreSQL)
incorrect_topics = Comment.select(:topic_id).where(:sender_id => user_id).map { |elem| elem.topic_id }
ids = select(:id).where(["id NOT IN (?)", incorrect_topics]).map { |elem| elem.id }
它工作正常,但我想如果应用程序变得更大,那将是严重的问题。
感谢。
答案 0 :(得分:1)
如果您需要的只是ID,那么您可以绕过所有ActiveRecord的东西并手动完成:
ids = connection.select_rows(%Q{
select id
from topics
where id not in (
select topic_id
from comments
where sender_id = #{user_id.to_i}
)
}).map { |r| r.first.to_i }
如果您确定user_id
已经是整数,那么您不需要.to_i
。您也可以使用#{connection.quote(user_id)}
。如果您想避免使用map
手动展开行,也可以使用与select_values
相同的SQL。
如果您想要主题实例,那么find_by_sql
将是一个选项:
topics = find_by_sql(%q{
select *
from topics
where id not in (
select topic_id
from comments
where sender_id = :user_id
)
}, :user_id => user_id)
使用直接SQL时,有些事情比尝试将其包装在ActiveRecord中更清楚。
答案 1 :(得分:0)
也许这样的事情可行:
incorrect_topics = Comment.where('sender_id <> ?', user_id).topics
让我知道无论如何都会帮助你。