我正在尝试做什么:我有一个模型“Recipe”,我在其中定义了一个方法“搜索”,它从复选框中获取一串字符串(我称之为标签),以及单个字符串。我们的想法是在数据库中搜索包含字符串的“名称”或“说明”中包含任何内容的食谱,并且还有任何与其“标记”属性匹配的标记。
问题:搜索方法返回我的数据库中的所有配方,并且在查找特定参数时似乎完全不起作用。
控制器中的操作方法:
def index
@recipes = Recipe.search(params[:search], params[:tag])
if !@recipes
@recipes = Recipe.all
end
respond_to do |format|
format.html
format.json { render json: @recipe }
end
end
我模型中的搜索方法:
def self.search(search, tags)
conditions = ""
search.present? do
# Condition 1: recipe.name OR instruction same as search?
conditions = "name LIKE ? OR instructions LIKE ?, '%#{search[0].strip}%', '%#{search[0].strip}%'"
# Condition 2: if tags included, any matching?
if !tags.empty?
tags.each do |tag|
conditions += "'AND tags LIKE ?', '%#{tag}%'"
end
end
end
# Hämtar och returnerar alla recipes där codition 1 och/eller 2 stämmer.
Recipe.find(:all, :conditions => [conditions]) unless conditions.length < 1
end
为什么它会返回所有记录的任何想法?
答案 0 :(得分:0)
如果你使用rails 3,那么很容易找到条件
def self.search(string, tags)
klass = scoped
if string.present?
klass = klass.where('name LIKE ? OR instructions LIKE ?', "%#{string}%", "%#{string}%")
end
if tags.present?
tags.each do |tag|
klass = klass.where('tags LIKE ?', "%#{tag}%")
end
end
klass
end
答案 1 :(得分:0)
当你这样做时
search.present? do
...
end
忽略该块的内容 - 将块传递给不期望的块的函数是完全合法的,但是除非函数决定,否则不会调用块。因此,您的条件构建代码都不会被执行。你可能意味着
if search.present?
...
end
正如jvnill指出的那样,操作范围通常比手工构建SQL片段更好(和更安全)