рубин на рельсах перекрывающих равных - PullRequest
3 голосов
/ 17 января 2011

У меня есть модель user.rb (это ActiveRecord :: Base, не уверен, имеет ли она отношение к обсуждению)

В некоторых представлениях я сравниваю двух пользователей с помощью:

<% if current_user == user %>

Результат недетерминированный (иногда результат истинный, а иногда ложный), и я не уверен, почему.

Если я переключу его на

<% if current_user.id == user.id %>

Он работает какожидается.Но тогда мне нужно разобраться со случаем, когда пользователь (-и) может быть нулевым.

Мой вопрос: что здесь происходит?

Почему user1 == user2 терпит неудачу здесь?

Должен ли я переопределять ==, или

Должен ли я использовать альтернативный метод, например, равный ?, === или eql?

Не должен ли тот факт, что пользователь.rb - это ActiveRecord :: Base mean == по умолчанию сравнивает уже поля id?

Ответы [ 3 ]

3 голосов
/ 17 января 2011

Если вы посмотрите на исходный код ==

      # File lib/active_record/base.rb, line 2427
2427:       def ==(comparison_object)
2428:         comparison_object.equal?(self) ||
2429:           (comparison_object.instance_of?(self.class) &&
2430:             comparison_object.id == id &&
2431:             !comparison_object.new_record?)
2432:       end

Вы увидите, что он должен возвращать true, когда идентификаторы объектов совпадают.Если ваш код <% if current_user == user %> не работает для того же объекта пользователя, у вас определенно происходит что-то странное.

Можете ли вы опубликовать этот фрагмент кода в контексте?

1 голос
/ 17 января 2011

Если вы хотите пойти дальше о равенстве в ruby, взгляните на этот очень хороший пост в блоге:

http://www.skorks.com/2009/09/ruby-equality-and-object-comparison/

Надеюсь, это поможет вам понять.

1 голос
/ 17 января 2011

С http://api.rubyonrails.org/classes/ActiveRecord/Base.html#method-i-%3D%3D

Возвращает истину, если для сравнения тот же самый точный объект, или объект сравнения того же типа и сам имеет идентификатор, и он равен comparison_object.id.

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

Обратите внимание, что уничтожение записи сохраняет свой идентификатор в модели Например, удаленные модели все еще сопоставимый.

Должно совпадать current_user == user

Как вы выбираете объект current_user?

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