2014-10-25 3 views
0

У меня есть модель с one_to_many отношения к другой модели, такие, что:Rails 3 ActiveRecord запроса в массиве

user.area_ids = [1, 2, 3] 

А потом другая модель, которая разделяет отношения, но это один к одному.

listing.area_id = 1 

Как я запрашиваю для всех списков, которые либо area_id из 1 2 или 3. Я надеюсь сделать что-то вроде ...

Listing.where("area_id IN ?", user.area_ids) 

Но это не работает.

Любая помощь будет оценена!

+0

Try: 'user.area_ids.join ('') ' – Brian

+1

Нет @ Брайан, это очень некрасиво решение. Rails понимает, как делать 'where (field: [1,2,3])' просто отлично. – meagar

+0

Huh, TIL, спасибо @meagar – Brian

ответ

3

Вы слишком умны. Rails понимает, как сделать where(field: [1,2,3]) просто отлично.

Если вы дадите where обычным key: value, где значение представляет собой массив, оно построит для вас where FIELD in (a,b,c).

Просто используйте

Listing.where(area_id: user.area_ids) # select ... where area_id in (1,2,3) 
+0

Спасибо! Это сработало для меня, как и другой ответ. Просто ради изучения - почему я должен избегать создания запроса вручную. Проблема безопасности? –

+0

Нет, потому что нет абсолютно никакой необходимости. Rails может это сделать, поэтому пусть Rails сделает это. Бэкэнд базы данных, который вы используете сейчас, может использовать 'where in (...)', но завтра вы можете решить, что хотите использовать другую базу данных, и если вы разрешите Rails делать то, что хорошо, ваш код не будет должны измениться вообще. Если вы создали кучу запросов вручную, это будет головная боль. – meagar

+0

Спасибо за быстрый ответ. Что делать, если я хочу запросить другой путь со стороны пользователя? Я хочу, чтобы все пользователи имели 1 в user.area_ids (listing.area_id)? –

2

Вы забыли скобки вокруг знака вопроса :) попробовать это:

Listing.where("area_id IN (?)", user.area_ids) 

Но как по мне, более правильный путь, чтобы сделать его чище с помощью

class User 
    has_many :areas 
    has_many :listings, through: :areas 
end 

, а затем просто звоните

user.listings 
Смежные вопросы