Сложный запрос ActiveRecord с множеством объединений - PullRequest
2 голосов
/ 18 февраля 2011

Я создаю некоторую форму для фильтрации своих пользователей, таблица User, и я открываю радости ActiveRecord.

  • User имеет name и function столбцы.

  • User имеет много Address

  • Address имеет country и town столбцы.

  • User имеет много Hobby

  • Hobby имеет столбец category.

В моих параметрах у меня есть name, function, country, town и category.

Я хочу получить всех пользователей, которые соответствуют хотя бы одному из этих параметров (условие OR, я использую базу данных MySQL).

Заранее спасибо.

Ответы [ 3 ]

3 голосов
/ 18 февраля 2011

С макушки головы, я думаю, это сработает:

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 голос
/ 18 февраля 2011

Иногда, когда вам нужно выполнить поиск по нескольким таблицам, вам лучше денормализовать ваши данные в индексе.Я должен был сделать это более года назад и решил использовать комбинацию Sunspot и Solr , и это сработало очень хорошо для меня.

0 голосов
/ 18 февраля 2011

Я скопирую код ниже, чтобы вы увидели, что я ожидал.

Запрос построен с 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...