2012-03-10 56 views
0

我试图在我的web应用程序中创建基本搜索。这里是搜索功能的代码。Rails基本搜索和PostgreSQL

def self.search(title, category_id, city_id) 
    if title || category_id || city_id 
     joins(:category).where('title LIKE (?) AND category.category_id IN (?) AND city.city_id IN (?)', "%#{title}%", "%#{category_id}%", "%#{city_id}%") 
    else 
     scoped 
    end 
    end 

我在我的模型这些协会:

has_one :category 
    has_one :city 

而且我得到这个错误

ActionView::Template::Error (PG::Error: ERROR: missing FROM-clause entry for ta 
ble "category" 
LINE 1: ..._id" = "events"."id" WHERE (title LIKE ('%%') AND category.c... 

我使用PostgreSQL。我能做些什么来消除这个错误?

回答

7

您使用的joins的形式需要关联名称,SQL要表名。该表应该被称为categories

一些其他的东西:

  1. 我没有看到你加入:city任何地方,你的下一个错误将是“缺少FROM子句的表项‘城市’的解决方案将是.joins(:city)和使用。 citieswhere,但请继续阅读反正。
  2. 你不需要周围LIKE值括号,只是title LIKE ?是好的。
  3. 您使用的是该类别和城市表达式,但你给他们喜欢模式,这将无法正常工作:身份证瓦特生病是数字,你可以使用数字LIKE。如果你使用的是IN,那么你通常会提供一个可能的值列表,如果你只想匹配一个值,那么只需使用=和占位符的一个值。
  4. categories表可能没有category_id列,对于cities表和city_id列也是如此。这两列应该在你模型的表格中。
  5. 当你没有标题时寻找一个标题没有多大意义。同样适用于国家和城市。

这看起来好像有很多问题,但他们可以不费多大力气:

def self.search(title, category_id, city_id) 
    rel = scoped 
    rel = rel.where('title like ?', "%#{title}%") if(title) 
    rel = rel.where('category_id = ?', category_id) if(category_id) 
    rel = rel.where('city_id  = ?', city_id)  if(city_id) 
    rel 
end 

,你甚至不都需要joins或明确的表名。

+1

+100像往常一样亩提供了一个伟大的优雅的解决方案,加上很好的解释。时间为mucasts! – 2012-03-11 00:20:03

+0

@MichaelDurrant:谢谢,但我没有'铸造的声音。 – 2012-03-11 00:43:01

+0

非常感谢! – kelheor 2012-03-11 09:26:29