Rails只提供" belongs_to"

时间:2014-03-27 14:10:21

标签: ruby-on-rails rails-activerecord relation

我有author模型,article模型和metric模型。作者有很多文章,文章有很多指标。

articles_controller的节目动作中我没有@articles = Article.where(author_id: params[:id])将文章限制为该作者的文章。我可以为指标做类似的事情吗?是否有类似@metrics = Metric.WHICHBELONGSTO(@articles)之类的东西?

或者我可以传递一组允许的ID吗?比如@metrics = Metric.where(article_id is part of @articles IDs?)

4 个答案:

答案 0 :(得分:3)

如果Article有多个Metric,您只需通过该关联获取这些记录:

@metrics = Article.find(article_id).metrics

如果您有一系列文章想要查找指标,例如在批量更新作业中,您还可以执行以下操作:

@metrics = Metric.where(article_id: @articles).all

ActiveRecord将自动构建正确的查询。

答案 1 :(得分:1)

 @metrics = Metric.where(article_id: @articles.map(&:id))

应该工作

答案 2 :(得分:0)

coreyward的答案很好,但这是另一种获取author_id假设Metric belongs_to :article

的指标的方法
@metrics = Metric.joins(:article).where(articles: { author_id: params[:id] })

答案 3 :(得分:0)

您可以将引用的指标包含在一个ActiveRecord语句中,只需展开您正在使用的指标:

@articles = Article.where(author_id: params[:id]).includes(:metrics).all

这将加载指定作者的文章,并一次性包含与这些文章相关的所有指标。然后,您可以将对象放在一个整洁的结构中,而不必单独处理这些文章并将其映射到它们的度量标准。

像这样访问它们(例如在ERB中):

<% @articles.each do |article| %>
  <%= article.title %>
  <%= article.text %>
  <% article.metrics.each do |metric| %>
    <%= metric.value %>
  <% end %>
<% end %>

此处的优点是预先加载了所有相关指标。如果您之前只是在没有使用article.metrics方法加载它们的情况下调用includes,则每次要使用每篇文章的指标时,您的服务器都需要访问数据库,从而大大减慢页面加载时间。