Краткий ответ:
вам не нужно is_contact?
, так как ActiveRecord уже определяет метод, который делает примерно то, что вы хотите: exist?
@user.contacts.exist? :user_contact_id => a_user_id
Имеет ли Contact
свои атрибуты, кроме id
, user_id
и user_contact_id
?
Если нет, то вам может быть лучше использовать has и относится ко многим ассоциациям.
Мне кажется, что использовать что-то вроде @user.has_contact? other_user
имеет больше смысла, чем @user.contacts.is_contact? other_user
Вы можете даже приблизительно сохранить текущие классы, используя опцию :through
.
class User < AR::Base
has_many :user_contacts
has_many :contacts, :through => :user_contacts,:source => :user_contact_id
def has_contact? user_id
contacts.exists? user_id
end
end
class UserContact < AR::Base
belongs_to :user
belongs_to :user_contact_id,
:class_name => "User",
:foreign_key => "user_contact_id" # The "contact" is an ID from the table user.
end
#
#...
@user.has_contact? other_user.id
Хотя использование has_and_belongs_to_many
было бы чище, в этом случае вам даже не понадобится модель для таблицы соединений, просто создайте ее в процессе миграции. Тогда вы могли бы
class User < AR::Base
has_and_belongs_to_many :contacts, :class_name => "User",:source => :user_contact_id
def has_contact? user_id
contacts.exists? user_id
end
end
#
#...
@user.has_contact? other_user_id