具有许多连接的复杂ActiveRecord查询

时间:2011-02-18 01:43:29

标签: ruby-on-rails activerecord

我正在创建一些表单来过滤我的用户,表User,我发现了ActiveRecord的乐趣。

  • Usernamefunction列。

  • User有许多Address

  • Addresscountrytown列。

  • User有许多Hobby

  • Hobby有一个category列。

在我的参数中,我有namefunctioncountrytowncategory

我基本上希望让所有匹配至少其中一个参数的用户(OR条件,我使用MySQL数据库)。

提前致谢。

3 个答案:

答案 0 :(得分:3)

在我的头脑中,我想这会做到这一点:

q = params[:query]

User.all(
  :conditions => ["
    users.name like ? or 
    users.function like ? or
    addresses.country like ? or
    addresses.town like ? or
    hobbies.category like ?
  ", q, q, q, q, q],
  :joins => [:hobbies, {:addresses => :country}]
)

答案 1 :(得分:1)

有时,当您需要搜索多个表时,最好在索引中对数据进行非规范化。我必须在一年前做到这一点,并选择使用SunspotSolr的组合,这对我来说非常有用。

答案 2 :(得分:0)

我复制下面的一些代码,让你看到我的期望。

查询是使用OR构建的,并且不包括空params(不包括它们的值,也不包括连接)。

def self.filtering(name, country, category)
  query, join_array, query_string = self, [], []
  unless name.blank?
    query_string << " users.name = :name"
  end
  unless country.blank?
    query_string << "addresses.country = :country"
    join_array << :addresses
  end
  unless category.blank?
    query_string << "hobbies.category = :category"
    join_array << :hobbies
  end

  join_array.each do |q|
    query = query.joins(q)
  end

  q.where(query_string * " OR ", :name => name, :country => country, :category => category)
end