我有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?)
答案 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
,则每次要使用每篇文章的指标时,您的服务器都需要访问数据库,从而大大减慢页面加载时间。