2015-01-01 46 views
1

確定。我想要實現的是基於根據特定文章生成相關文章的列表,並且希望根據與文章相關的類別獲取這些相關文章。我在這兩個模型之間有一個簡單的habtm關係:文章和類別(連接表名爲articles_categories)。我想創建一個相關的文章查詢基於一篇文章具有相同的category_id s的文章。例如,文章#1與類別#1和類別#2相關聯。我想編寫一個查詢來抓取文章#1的類別標識,然後查詢與這些相同類別(類別#1和類別#2)關聯的所有文章的文章模型。我已經嘗試了一切在陽光下,似乎無法弄清楚這一點。我試過各種各樣的.join聲明,似乎沒有任何工作。我試圖把它分解成兩個部分如下:查詢Ruby中的has_and_belongs_to_many關聯

我可以抓住所有的特定物品的類別ID,我想引用這樣的:

article_cat_ids = @article.category_ids 

第二部分是文章過濾器基於這些類別ID,但我無法弄清楚這一部分。

所以我的問題是,如何獲得與數組article_cat_ids中的類別ID相關的文章數組。作爲獎勵踢球者,我希望排除我最初引用的特定文章來創建article_cat_ids,以便文章列表不包含我試圖獲取相關文章的文章。

任何幫助,將不勝感激。

回答

0

聽起來很有趣。我認爲你的數據模型很好。

我們先嚐試在SQL中執行此操作。這將引導我們到ActiveRecord解決方案。

select a1.id 
from articles a1 
inner join articles_categories ac1 on ac1.article_id = a1.id 
inner join articles_categories ac2 on ac2.category_id = ac1.category_id 
inner join articles a2 on a2.id = ac2.article_id 
where a2.id = $1 
    and a1.id <> $1; 

這可行,但你也可以使用IN子句子查詢。你應該做一些基準測試,看看哪些數據性能更好。

現在,我們該如何將其轉換成ActiveRecord?老實說,你可能不想。無論如何,你最終會寫很多SQL。

article_id = 1 # or whatever 
Article. 
    joins('articles_categories ac1 on ac1.article_id = articles.id'). 
    joins('articles_categories ac2 on ac2.category_id = ac1.category_id'). 
    joins('articles a2 on a2.id = ac2.article_id'). 
    where(['a2.id = ? and a1.id <> ?', article_id]) 

AR是這些情況下的漏洞抽象。這應該可行,但在我看來,它的可讀性不如純SQL。

請注意,此解決方案是單個查詢。注意涉及多個查詢的其他解決方案。如果你使用例如1 + N的查詢問題很容易就會遇到。紅寶石中的一個循環。

相關問題