Question

I have a author model, a article model and a metric model. Author has many articles and article has many metrics.

No in my articles_controller's show action I have @articles = Article.where(author_id: params[:id]) which limits the articles to the ones by that author. Can I do something similar for the metrics? Is there a rails way to say something like @metrics = Metric.WHICHBELONGSTO(@articles)?

Alternatively can I pass an array of allowed IDs in? like @metrics = Metric.where(article_id is part of @articles IDs?)

Était-ce utile?

La solution

If Article has many Metrics, you would simply fetch those records through that association:

@metrics = Article.find(article_id).metrics

If you have a collection of articles you would like to find metrics for, such as in a batch update job, you could also do the following:

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

ActiveRecord will build the correct query automatically.

Autres conseils

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

Should work

coreyward's answer is fine but here's another way to fetch metrics given the author_id assuming that Metric belongs_to :article

@metrics = Metric.joins(:article).where(articles: { author_id: params[:id] })

You can include the referenced metrics in one ActiveRecord statement by simply expanding the one you are already using:

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

This loads the articles by the specified author and includes all metrics related to these articles in one go. You then have the objects in one tidy structure instead of having to juggle and map the articles to their metrics separately.

Access them like this (in ERB for example):

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

The advantage here is that all relevant metrics are preloaded. If you simply call article.metrics without previously loading them using the includes method, your server would need to access the database every time you want to use the metrics of each article, slowing down the page loading times considerably.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top