我有一种餐馆描述数据库,用户可以搜索他们正在寻找的餐馆。但是有太多的列描述了不同的属性,而我的搜索表单并没有得到太多的查询(?我不知道在这种情况下它是正确的表达方式,我是编程中的新手。 ..)仅适用于类别,地点和名称。
所以我创建了一个不同的数据库(rest_key),看起来像这样
class CreateRestKeys < ActiveRecord::Migration
def change
create_table :rest_keys do |t|
t.integer :category
t.string :name
t.string :addr
t.integer :restaurant_id # reference for real Restaurant model
t.timestamps
end
end
end
和我的餐厅模型&amp; RestKey模型如下所示(一对一关联)
class Restaurant < ActiveRecord::Base
has_one :rest_key
end
class RestKey < ActiveRecord::Base
belongs_to :restaurant
end
我首先想要获取用户的查询并找到RestKey,然后检索与该RestKey相关的餐馆。这种逻辑
Restaurant.joins(:rest_key).where("rest_keys.category = ? AND
rest_keys.name LIKE ? AND
rest_keys.addr LIKE ?",
search_category, "%#{search_name}%", "%#{search_addr}%")
但问题是用户可以在search_addr输入框中输入许多单词以保证准确性。所以我首先想到我可以为arr = params[:search_addr].split
这样的地址创建数组,并使用许多where子句执行上一个过程。
Restaurant.joins(:rest_key).where("rest_keys.category = ? AND
rest_keys.name LIKE ? AND
rest_keys.addr LIKE ? AND # addr search starts
rest_keys.addr LIKE ? AND
rest_keys.addr LIKE ? AND
rest_keys.addr LIKE ? AND
rest_keys.addr LIKE ?",
search_category, "%#{search_name}%", "%#{arr[0]}%", "%#{arr[1]}%", "%#{arr[2]}%", "%#{arr[3]}%", "%#{arr[4]}%")
即使我知识太差,我也觉得这段代码不能被称为代码。我可以循环where子句,还是有任何想法可以过滤地址输入?任何评论对我来说都是一个巨大的帮助!(我认为用户可以按奇数顺序输入地址字,所以我必须将它们拆分并用每个单词过滤)
答案 0 :(得分:0)
你可以试试这个。
您可以使用arr[0]
arr[1]
而不是matches_any
,array
rest_key_table = RestKey.arel_table
rest_key_table[:addr].matches_any(arr)
您可以使用以下方式
您可以按部分
进行尝试rest_key_table = RestKey.arel_table
@rest_categories = Restaurant.where(:rest_keys => {:category => search_category}, :joins => :rest_keys)
@rest_categories.where(rest_key_table[:addr].matches_any(arr))
答案 1 :(得分:0)
我不知道SQL可以将字符串作为rails中的查询。所以我改变了上面的代码,如
basic_callback
我希望这个答案可以帮助像我这样的新手。如果有更好的方法,请告诉我,这对我来说是一个很好的教训。