Получить несколько записей одним запросом - PullRequest
0 голосов
/ 26 декабря 2010

Таблица пользователей:

имя фамилия

Боб Пресли
Джейми Кокс
Люси Буш
Римский кокс

Найти пользователей

q = Query.new("Bob Presley, Cox, Lucy")
q.find_users => {0=>{:name=>"Bob", :lastname=>"Presley"}, 1=>{:lastname=>"Cox"}, 2=>{:name=>"Lucy"}}

Вопрос:

У меня есть хэш с несколькими именами и фамилиями. Мне нужно построить запрос Activerecord для получения всех пользователей из этого хэша.

Если у меня есть имя и фамилия, я должен найти пользователя с точно таким же именем и фамилией.

Если у меня есть только фамилия или имя, я должен найти всех пользователей с этим именем или фамилией. Поэтому, когда я ищу: фамилия => Кокс, он должен вернуть двух пользователей [Роман Кокс, Джейми Кокс]

я могу сделать

object = []
hash = q.find_users
hash.each do |data|
 #Pseudocode
 # object << User.where(:name => if data[:lastname] exist, :lastname => if data[:name] exist)
end

Но я думаю, что это крайне неэффективно. Как мне это сделать?

Окружающая среда

рельсы: 3.0.3
рубин: 1.9.2-голова
gem: meta_search https://github.com/ernie/meta_search

1 Ответ

1 голос
/ 26 декабря 2010

Я уверен, что это может быть хорошо реорганизовано (подсказка!), Но этот код ниже создаст SQL, который можно использовать в суб-выборе.

Код ниже не очищает входные значения. Обратите внимание, что вы должны санировать значения в h хэше!

h =  {0=>{:name=>"Bob", :lastname=>"Presley"}, 1=>{:lastname=>"Cox"}, 2=>{:name=>"Lucy"}}
conditions = ""
h.each_pair do |k,v|
  if not conditions.empty?
    conditions += " or "
  end
  conditions += "("
  a_condition = ""
  v.each_pair do |a,b|
    if not a_condition.empty?
      a_condition += " and "
    end
    a_condition += "#{a.to_s} = '#{b}'"
  end
  conditions += a_condition
  conditions += ")"
end
conditions = "("+conditions+")"    
p conditions
# => "((name = 'Bob' and lastname = 'Presley') or (lastname = 'Cox') or (name = 'Lucy'))"

# use the generated SQL conditions to find the users
@users = User.find(:all, :conditions => "(#{conditions})")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...