【问题标题】:Get the User of an Object in one query在一次查询中获取对象的用户
【发布时间】:2013-05-28 14:56:53
【问题描述】:

我有一个 Article 模型,它是 belongs_touser,所以我在这里找到特定文章的用户,如下所示:

article = Article.find(params[:id])
user = User.find(article.user_id)

如您所见,我通过两个查询来实现这一点,但我只想在一个查询中实现这一点。你推荐什么? tnx。

【问题讨论】:

  • 使用 ActiveRecord,您必须执行两次查询才能加载两个模型。
  • 正如亚历克斯所说,您遇到了两个查询。我能看到的唯一替代方法是编写手动 sql 查询,但这首先违背了活动记录的目的。

标签: ruby-on-rails ruby activerecord


【解决方案1】:
article = Article.includes(:user).where(:id => params[:id]).first

【讨论】:

  • 这会返回一个文章对象。他想要一个用户。
  • 此外,它仍然会运行两个查询。
【解决方案2】:

对不起:只要你想要两个对象,Rails 没有办法一次查询选择数据。

您可以构造一个查询同时选择ArticleUser的数据,将用户特定的数据存储在Article的非DB属性中,如

article = Article.where(id: params[:id]).joins(:user).select('articles.title, users.name').first
puts article.attributes['name']

在一个查询中选择所有数据,但这确实破坏了 Rails。你不会得到User 实例。

【讨论】:

    【解决方案3】:

    join 怎么样?

    user = User.joins(:articles).where(articles: {id: params[:id]}).first
    

    【讨论】:

    • 这是唯一正确的答案(如果他不需要文章对象)。
    【解决方案4】:

    试试这个:-

    article = Article.includes(:user).where("articles.id = ?",  params[:id]).first
    

    现在您可以访问类似 article.user 的用户,并且不会触发其他查询。

    这被称为急切加载:-

    在 Rails 指南上了解更多信息。

    http://guides.rubyonrails.org/active_record_querying.html#eager-loading-associations

    另见:

    http://railscasts.com/episodes/22-eager-loading
    http://railscasts.com/episodes/22-eager-loading-revised

    【讨论】:

    • 这会起作用,但仍会执行两个查询。这只是另一种方式真正的好处:user = User.includes(:articles).find(user_id) 这样即使有几篇文章,它仍然只有两个查询。
    • 这仍然会执行两个查询。
    猜你喜欢
    • 1970-01-01
    • 2016-06-21
    • 1970-01-01
    • 1970-01-01
    • 2012-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多