2011-08-30 46 views
2

在我的照片視圖中,有一個使用text_field進行搜索的選項。我想通過點擊預定義標籤添加一個選項來「搜索」。也許search不是最好的方式來做到這一點。通過SQL在不同模型中搜索的導軌過濾器

這是在我的模型的搜索方法:我不知道,我既正確調用此

def self.search(search) 
    if search 
    where('name or description or tag.name LIKE ?', "%#{search}%") 
    else 
    scoped 
    end 
end 

...但這些都是我的照片索引視圖中創建的鏈接:

<% @tags.each do |tag| %> 
    <%= link_to tag.name, :search => tag.name, :class => "tag" %> 
<% end %> 

Tags不在照片列表中,但與照片具有HABTM關係。我通常可以通過簡單地使用@ photo.tags.name或類似的東西來調用它們。 無論如何,當我點擊一個標籤時,它會吐出一個SQLite3::SQLException: no such column: tag.name: SELECT COUNT(*) FROM "photos" WHERE (name or description or tag.name LIKE '%landscape%')。有什麼想法嗎?也許有一個更好的方法來做到這一點呢?

回答

2

爲了找到標籤表中的字段,您必須加入它。爲了使它改變你的搜索方法是:

def self.search(search) 
    if search 
    joins(:tags).where('name or description or tags.name LIKE ?', "%#{search}%") 
    else 
    scoped 
    end 
end 
+0

太棒了!這是有效的,但我必須刪除'name或description',因爲它們是照片字段,而不是標籤字段。我是否需要爲標記搜索創建單獨的方法,還是可以指定'tags'名稱位於'tags'表中,而'name或description'位於照片表中? –

+0

如果這些字段在不同的表格中,你可以做到這一點,但只是爲了確保你可以使這個'連接(:標籤).where('photos.name或photos.description或tags.name LIKE?','% #{search}%「)' – cicloon

+0

謝謝,這似乎是伎倆。有趣的是,現在有一張特定照片顯示任何搜索結果的5倍!真奇怪。我會試着找出原因。 –

1

與自己的解決方案,以共同的問題而來的是一個學習的好方法,但是,我建議你委託標籤工作外包給專門的寶石: https://github.com/mbleigh/acts-as-taggable-on,所以你可以專注於你的業務。

此外,使用關係模型來保存標籤有點矯枉過正:在大多數情況下,逗號分隔的標籤列表應該足夠了。

+1

是的,我確實選擇手動構建標籤以瞭解其工作原理;但也許它是理想的切換到寶石... –