连接表 - Rails中的关联3

时间:2012-02-05 08:41:21

标签: sql ruby-on-rails ruby-on-rails-3 postgresql associations

例如,我有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 }

它工作正常,但我想如果应用程序变得更大,那将是严重的问题。

感谢。

2 个答案:

答案 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

让我知道无论如何都会帮助你。