2015-01-28 3 views
2

Давайте представим себе, если что у меня есть 5 записей пользователей в БД, один из этих 5 записей является пользователем с возрастом атрибутом 30.Нахождение всех комбинаций записи

И что я хочу, чтобы найти или создать двух пользователей с age атрибутов 28 и 30.

Если бы я это сделать:

User.where(age: [28, 30]) 

Это даст мне один пользователь, который имеет возраст 30, но это не даст мне обратно пользователю с 28 лет (не существовать).

Или, если я делаю это

User.where(age: 28).where(age: 30) 

Там нет записи с обоих возрастов присутствующих. Предположим, что возраст - это просто произвольный атрибут, а возрастное значение - произвольное значение, которое может быть любым.

Как получить все записи на основе определенной комбинации атрибутов/значений, и если они еще не созданы, создайте их?

+1

Название не описывает вопрос. Вы не спрашиваете, как найти комбинации записей, вы спрашиваете, как «find_or_create» несколько записей на нескольких условиях одновременно. – numbers1311407

+0

Я предполагаю, что ваш пример гипотетический, потому что возраст и пользователи просто не имеют для меня никакого смысла (делая случайных пользователей определенного возраста?). Короче: это невозможно, нет коротких путей, а не 'find_or_create_by' за один раз. Из такого предложения where нечего говорить, какие варианты не встречались, а потом создавать? Не могли бы вы объяснить, что вы пытаетесь достичь более конкретно? – nathanvda

ответ

2

Вы можете фактически использовать range на where условиях:

User.where(age: (28..30)) 

Это будет работать для поиска. Чтобы создать нового пользователя с возрастом недостающих значений, я считаю, что вам нужно будет его вручную закодировать.

+0

если у меня есть пользователь в возрасте 29 лет, это заберет его? –

+0

Просто протестировал его. Это будет. – Vardarac

+0

Это не то, что я хотел. Спасибо за усилия, хотя –

1

Если вы хотите диапазон, вы можете просто положить сырое заявление SQL в ИНЕКЕ, как это:

User.where("age >= 28 AND age <= 30") 

Если вы хотите определенный набор возрастов, вы можете использовать список в WHERE пункт:

unless User.where("age IN (28,30)").length > 0 
    # Code to create user with the age you want 
end 

Наконец, есть также first_or_initialize и first_or_create методы, которые могут быть присоединены к ИНЕКЕ. Если запись из where не найдена, она инициализируется/создается.

User.where("age IN (28,30)").first_or_initialize 

Rails 4 имеет аналогичный метод find_or_create_by.

+0

это создаст обе записи в состоянии? один из них уже находится в db, а другой - нет? –

+1

Я не думаю, что последний метод загрунтован, чтобы создать все, что отсутствует в вашем диапазоне. Если вы хотите это сделать, вам нужно будет перебрать все значения, отсутствующие в нужном вам диапазоне, и создать их. – Vardarac

Смежные вопросы