Ruby On Rails - Как получить метод вызова объекта - PullRequest
0 голосов
/ 05 февраля 2010

Позвольте мне объяснить мою проблему:

У меня есть 2 модели:

class User < AR::Base
 has_many :contacts
end
class Contact < 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.

 def self.is_contact?(user_contact_id)
  # CHECK IF THE RECORDS EXIST VIA DB OR CACHE OR WHATEVER #
 end
end

Имея экземпляр User как @user, вы можете проверить is_contact? как это:

@user.contacts.is_contact?(a_user_id)

Это отлично работает, моя проблема в том, что я хочу получить доступ к атрибутам @user внутри is_contact? Метод в контакте.

Возможно ли это?

Спасибо всем вам, ребята.

Ответы [ 2 ]

3 голосов
/ 06 февраля 2010

Краткий ответ: вам не нужно 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
2 голосов
/ 05 февраля 2010

Если вы хотите получить доступ к атрибутам @user, то у вас должно быть что-то вроде этого:

class User < AR::Base
  has_many :contacts
end

class Contact < 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.

  def is_contact?(user_contact_id)
    user.firstname = 'John' # just an example
    # CHECK IF THE RECORDS EXIST VIA DB OR CACHE OR WHATEVER #
  end
end

EDIT:

Да, верно, вам также нужно изменить способ вызова этого метода. Поэтому, возможно, лучшим решением будет использовать named_scope:

# Contact model
named_scope :has_contact, lamda {|user_contact| { :conditions => {:user_contact_id => user_contact } } }

Тогда вы можете сделать:

@user.contacts.has_contact(some_id).count

Он проверит, сколько контактов с some_id имеет пользователь @user.

...