Rails 3: Scope возвращает массив - PullRequest
       2

Rails 3: Scope возвращает массив

0 голосов
/ 26 октября 2011

Я использую область, чтобы получить Предмет для определенного пользователя:

В модели изделия

belongs_to :user    
scope :for_user, lambda { |user| where(:user_id => user) }

Модель пользователя

has_many :items

Задача

При вызове Item.includes(:user).for_user(3) вместо отношения ActiveRecord возвращается массив. Я ожидаю, что он будет вести себя как Item.includes(:user).find_by_user_id(3), что возвращает отношение ActiveRecord.

Спасибо за вашу помощь.

Ответы [ 2 ]

3 голосов
/ 26 октября 2011

если вы проведете дополнительное исследование, вы обнаружите, что он действительно возвращает объект отношения.

Но при необходимости он преобразует его в массив.

А именно, если вы находитесь в консоли и говорите > Item.includes(:user).for_user(3), она попытается проверить ее и, следовательно, выполнить преобразование.

Но непременно сработает следующее

scope = Item.includes(:user).for_user(3)

# does a db count
scope.count

# does a db select limit 1
scope.first

# does a full db select
scope.all
0 голосов
/ 26 октября 2011

Использование where(:user_id => user) вместо динамического метода, такого как find_by_user_id, всегда будет возвращать массив. Если вас интересует только первая запись, возвращенная из вашей области видимости, вы можете изменить область видимости на что-то вроде

scope :for_user, lambda { |user| where(:user_id => user).first }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...