rails(使用MySQL)中的“where where”子句用于一对一连接

时间:2015-01-16 13:50:07

标签: mysql ruby-on-rails

我有一种餐馆描述数据库,用户可以搜索他们正在寻找的餐馆。但是有太多的列描述了不同的属性,而我的搜索表单并没有得到太多的查询(?我不知道在这种情况下它是正确的表达方式,我是编程中的新手。 ..)仅适用于类别,地点和名称。

所以我创建了一个不同的数据库(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子句,还是有任何想法可以过滤地址输入?任何评论对我来说都是一个巨大的帮助!(我认为用户可以按奇数顺序输入地址字,所以我必须将它们拆分并用每个单词过滤)

2 个答案:

答案 0 :(得分:0)

你可以试试这个。

您可以使用arr[0]

简单地使用arr[1]而不是matches_anyarray
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

我希望这个答案可以帮助像我这样的新手。如果有更好的方法,请告诉我,这对我来说是一个很好的教训。