【问题标题】:Rails double match from has_and_belongs_to_many来自 has_and_belongs_to_many 的 Rails 双重匹配
【发布时间】:2012-07-22 08:48:18
【问题描述】:

假设我有一个 has_and_belongs_to_many 关系,我有帖子和类别。查找某个类别中的所有帖子或特定帖子所属的所有类别很简单。但是,如果我想查找属于 多个 类别的帖子列表怎么办?例如,关于 Rails 中安全主题的帖子列表,我可能想要属于“安全”和“Rails”类别的帖子。

是否可以使用 ActiveRecord 中内置的查找器方法来执行此操作,或者我需要使用 SQL 吗?有人可以解释一下吗?

【问题讨论】:

标签: sql ruby-on-rails has-and-belongs-to-many


【解决方案1】:

你可以使用includesjoins,比如:

@result = Post.includes(:categories).where("categories.name = 'Security' OR categories.name = 'Rails'")

@result = Post.joins(:categories).where("categories.name = 'Security' OR categories.name = 'Rails'")

我还建议检查this railscast 以了解joinsincludes 之间的区别,以便您决定哪种情况更好。

【讨论】:

  • 好吧,我的意思是同时询问多个类别,所以只发布属于“安全”和“Rails”类别的帖子。但是,当我使用上面的示例,替换 AND 或 OR 时,我没有得到任何结果。
  • name on categories.name 只是一个例子。您需要用正确的列名替换它。请检查您的日志文件以查看此 ruby​​ 查询生成的 SQL。您也可以对它进行部分测试,例如:@result = Category.where("name = 'Security' AND name = 'Rails'"),这样您就可以确保它只返回符合条件的类别。还要确保你在数据库中有这个类别,否则它不会返回任何东西..
  • 是的,我已经检查了所有这些。 Category.where("name = 'Security' AND name = 'Rails'") 将只返回名称同时为“Security”和“Rails”的类别,这是没有意义的。所有帖子都可以有多个类别,我需要一种方法来查找同时属于两个单独类别“安全”和“Rails”的所有帖子。诸如此类的帖子和类别已经在我的数据库中。
【解决方案2】:

我对 Rails 一无所知,但我正在尝试用一些 sql 做类似的事情。这可能对我们俩都有效,也可能无效....

我有一个文章表和一个应用类别的查找表。为了获得具有“安全”类别和“导轨”类别的文章,我将文章表加入到类别表中,当然,还要再次加入它。类别表的每个连接都使用表别名中的提示(即语言或主题) 伪代码:

SELECT article.*,
category_language.category_id,
category_topic.category_id

FROM category category_language
INNER JOIN article ON category_language.articleID = article.articleID 
INNER JOIN category category_topic ON article.articleID = category_topic.articleID 

WHERE category_language.category_id in (420) /* rails */
and category_topic.category_id in (421) /* security */

这还没有完全解决,我希望如果我在这里表现出我的无知,有人会说出来。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-10
    • 2021-05-06
    • 1970-01-01
    • 1970-01-01
    • 2012-01-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多