我正在使用Postgres作为db在Rails项目中创建搜索功能。
这是我的代码
def self.search(search)
if search
find(:all, :conditions => ["LOWER(name) LIKE LOWER(?) OR LOWER(city) LIKE LOWER(?) OR LOWER(address) LIKE LOWER(?) OR (venue_type) LIKE (?)", "%#{search}%", "%#{search}%", "%#{search}%", "%#{search}%"])
else
find(:all)
end
end
但我的问题是“venue_type”是一个整数。我为venue_type
做了一个案例切换def venue_type_check
case self.venue_type
when 1
"Pub"
when 2
"Nattklubb"
end
end
现在问我的问题:当venue_type是int时,如何在查询中找到一些内容?
答案 0 :(得分:0)
我认为您必须使用if-else condition in your where clause
之类的内容
find(:all, :conditions => ["LOWER(name) LIKE LOWER(?) OR LOWER(city) LIKE LOWER(?)
OR LOWER(address) LIKE LOWER(?) OR
IF(venue_type == 1, 'Pub', IF(venue_type == 2, 'Nattklubb2', '')) LIKE (?)",
"%#{search}%", "%#{search}%", "%#{search}%", "%#{search}%"])
答案 1 :(得分:0)
如果您使用的是rails 3.2或更高版本,则应使用where( [] )
代替find
。
where( [ "field like ?", field ] ).order(). ...
另外,在使用pgsql时,为什么不使用ilike
而不是like
使用lower
?
在你搜索int或不是int的情况下,我会使用不同的查询。
search.to_i != 0
答案 2 :(得分:0)
请尝试此代码。在这里,我将switch case添加到where子句。
def self.search(search)
if search
find(:all, :conditions => ["LOWER(name) LIKE LOWER(?) OR LOWER(city) LIKE LOWER(?) OR LOWER(address) LIKE LOWER(?) OR (venue_type = CASE WHEN 'pub' = ? THEN 1 WHEN 'nattklubb' = ? THEN 2 END)", "%#{search}%", "%#{search}%", "%#{search}%", "#{search.downcase}", "#{search.downcase}"])
else
find(:all)
end
end