named_scope в зависимости от существования ассоциации нарушает тесты - PullRequest
1 голос
/ 29 января 2010

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

class User < ActiveRecord::Base
  named_scope :clients, 
    :conditions => "roles_users.role_id = #{Role.find_by_name('client').id}"
end

При тестировании выдает ошибку:

Called id for nil, which would mistakenly be 4 -- if you really wanted (etc.)

Ролевые светильники:

client:
  name: client
user:
  name: user

Видимая проблема: Rails загружает этот класс, прежде чем загружает приборы. Когда он загружает класс, он оценивает named_scope. В этот момент нет никаких ролей, поэтому он взрывается.

Возможное решение:

named_scope :clients, 
  lambda { { :conditions => "roles_users.role_id = #{Role.named('client').id}" } }

Однако я не доволен этим решением, поскольку оно вносит дополнительную сложность и, предположительно, (небольшое?) Снижение производительности, просто для того, чтобы тесты работали правильно. Я бы хотел альтернативу. Вы можете помочь?

1 Ответ

1 голос
/ 29 января 2010

Решение, которое вы предлагаете, является правильным решением. Я также рекомендовал бы изменить ваш код на:

named_scope :clients, lambda { { :conditions => ['roles_users.role_id = ?', Role.named('client').id } }

Альтернативой может быть:

named_scope :clients, :joins => :role, :conditions => ['roles.name = ?', 'client']

Вы также можете подумать о выполнении:

named_scope :with_role, lambda { |r| { :conditions => ['roles_users.role_id = ?', r.id] } }

Или даже (для дополнительных очков)

Role.find_by_name('client').users

В любом случае, я надеюсь, что это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...