【问题标题】:What is the most efficient way to query on columns in belongs_to association in Rails 3?在 Rails 3 中查询 belongs_to 关联中的列的最有效方法是什么?
【发布时间】:2012-04-20 09:30:24
【问题描述】:

在 Rails 3 应用程序中,我试图查找父关联中的列相等的记录是特定字符串。例如,类别名称 = "my_category" 的帖子。

class Post
  belongs_to Category
end

class Category
  has_many Posts
end

类别包含一个名称列,这是我可用于运行搜索的唯一数据。所以我不能直接在 category_id 上过滤。

最有效的 Rails 方式是什么?我尝试了几个看起来应该可行的选项,但没有!

Post.joins(:category).where('category.name'=>'my_category')
Post.joins(:category).where(:category=>{:name=>'my_category'})
Post.includes(:category).where('category.name'=>'my_category')
Post.includes(:categories).where('category.name'=>'my_category')
Post.includes(:category).where(:category=>{:name=>'my_category'})

我可以在两行中看到如何做到这一点

category=Category.where(:name=>"my_category")
Post.where(:category_id=>category)

但我想知道我是否忽略了一些 Rails 魔法?对不起,如果这是一个菜鸟问题,我还在学习!

【问题讨论】:

    标签: ruby-on-rails activerecord


    【解决方案1】:
    Post.joins(:category).where( :categories => { :name => "my_category" } )
    

    请注意,参数:categories 在 WHERE 部分是复数形式。

    【讨论】:

    【解决方案2】:

    @blackbird07 对@John Beynon 回答的评论是对的。

    你应该试试

    Category.find_by_name("my_category").posts
    

    find_by 帮助器返回单个对象而不是数组。

    【讨论】:

    • 这将导致 2 个选择语句而不是 1 个 - 一个用于类别,一个用于帖子
    • @edward,谢谢。我学到了一些新东西。我已经为单个数据库调用授予了 blackbird 的答案。但是感谢您的帮助,给个好评。
    【解决方案3】:

    使用 has_many 关系给你的方法;

    根据评论原文不正确

    Category.where(:name => "my_category").posts
    

    更正

    Category.find_by_name("my_category").posts
    

    Category.where(:name => "my_category").first.posts
    

    假设您在 Post 模型上有一个 category_id 列。

    【讨论】:

    • 这行不通,因为Category.where 不会返回一个条目,而是一个条目数组。
    • 感谢您的更新。这仍然会产生 2 个 SELECT 语句 - 一个用于类别,第二个用于帖子
    • 谢谢约翰!真的很棒的答案。我学到了一些新东西来整理我的代码。由于最少的数据库交互,我已经给出了黑鸟的答案。但是感谢您的帮助!
    • 完全同意 - 对于最有效的查询,单个查询总是获胜。干得好黑鸟! :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多