Класс Rails ActiveRecord::Base
определяет метод ==
, который возвращает true
, если объекты идентичны или имеют одинаковый идентификатор.
Я переопределил ==
в нескольких моих моделях Rails, чтобы учесть более значимые условия равенства. Они работают, когда я сравниваю объекты напрямую (например, через script/console
), но если я делаю что-то вроде my_array_of_models.include? other_model
, include?
всегда возвращает false
. даже если массив содержит «равный» объект (согласно моему определению).
Я исправил это, выполнив, например, my_array_of_models.any? { |el| el.attr == other_model.attr }
(в любом случае, мне кажется, что вам рекомендуется проводить сравнения), но мне интересно: имеет ли смысл переопределять ==
в ActiveRecord моделирует или ActiveRecord делает что-то на высоком уровне, что делает такой переопределенный метод бесполезным (или, что еще хуже, опасным)?
Источник
Вот мои реализации моих переопределенных методов. Есть два класса, User
и Contact
. Users
имеют уникальные адреса электронной почты, поэтому ==
возвращает true, если адреса электронной почты совпадают. Contact
является мостом между Users
(как отношения "друг" в социальных сетях) и должен возвращать true
, если они имеют одинаковые user_id
.
class User < ActiveRecord::Base
def ==(other)
other.respond_to?(:email) and self.email == other.email
end
end
class Contact < ActiveRecord::Base
def ==(other)
if other.class == self.class
self.user == other.user
elsif other.kind_of? User
self.user == other
else
false
end
end
end
Как я уже отметил, он работает при прямом сравнении (например, one_object == another_object
), но my_array_of_objs.include? included_obj
всегда возвращает false
.