2011-03-22 59 views
3

所以,我試圖尋找一個如何做到這一點的例子,我不知道我甚至不知道如何描述我想要做的事情。當談到SQL時,我是一個徹頭徹尾的noob,我確信這是非常基本的,但我完全失去了:Rails:通過相關模型屬性查找?

我有一個模型,Photo,其中has_many :tags, :through => :taggings。標籤有一個名稱和一個ID。

我想要做的事,如:Photo.where(#tag_name in [array])

......但就像我說我不知道​​如何寫類似的東西,或者什麼搜索看看在谷歌的例子。

任何人都可以給我一個這種查詢的例子,它可能被稱爲?

謝謝!

回答

1

所以,作爲Brett的方法一擰,事實證明了以下工作沒有打破PostgreSQL的:

def self.tagged_with(string) 
    array = string.split(',').map{ |s| s.lstrip } 
    select('distinct photos.*').joins(:tags).where('tags.name' => array) 
end 

問題解決了!請參閱this article瞭解爲什麼這是一個比'group'更好的主意。

+5

兩個downvotes沒有評論?不是很有用。 – Andrew 2011-03-29 05:17:14

+0

警告:文章鏈接現在重定向到一個廣告頁面:http://www.awesomeful.net/ – theUtherSide 2017-10-09 22:04:40

9

只是嘗試這樣做我自己的一個類似的模型,似乎很好地工作:

Photo.joins(:tags).where('tags.name' => ['herp','derp']).group(:id) 

而且,這裏的AREL querying interface rails 3 uses一個巨大的資源,有關於這些和其他的ActiveRecord調用相關的查詢。

+0

太棒了。兩個問題:1-這種查詢是否有名字? 2-什麼是.group(:id)在做什麼? – Andrew 2011-03-22 19:13:20

+0

這是一個內部聯接(activeRecord在標籤中指出如何自動連接標籤表,因爲您使用'has_many:through'),where子句確定要返回哪些記錄。在我的本地數據庫中,照片可以有多個標籤。如果一張照片被標記爲「herp」和「derp」,那麼這個查詢(不帶'.group')將返回同一張照片的兩個相同副本(因爲它匹配兩次)。按ID分組結果基於ID唯一 - 這是因爲你正在查詢照片,假設照片表的ID。 – 2011-03-22 19:29:13

+0

非常感謝您的幫助! – Andrew 2011-03-22 19:42:55