2014-03-27 76 views
1

我有一個author模型,article模型和metric模型。作者有許多文章和文章有很多指標。Rails只給出記錄,「belongs_to」

否在我的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

如果你有嵌套的資源'Author'和'Article',那麼你不應該使用'author_id:params [:author_id]'而不是'author_id:params [:id]'來獲取'Articles'。 –

回答

3

如果Article有很多Metric S,您只需通過協會獲取這些記錄:

@metrics = Article.find(article_id).metrics 

如果你有文章的集合,你想查找指標,例如在批量更新作業中,您還可以執行以下操作:

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

ActiveRecord會自動建立正確的查詢。

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

應工作

+1

在這種情況下,ActiveRecord實際上會處理將模型實例轉換爲它們各自的ID。如果你傳遞一個'Relation',ActiveRecord使用一個子查詢而不是做一個單獨的查詢。 ;) – coreyward

0

coreyward的回答是不錯,但這裏的另一種方式獲取指標給出的author_id假設Metric belongs_to :article

@metrics = Metric.joins(:article).where(articles: { author_id: params[:id] }) 
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方法加載它們,則每次您希望使用每篇文章的指標時,服務器都需要訪問數據庫,從而大大減緩了頁面加載時間。