Ruby On Rails - 如何获取对象方法调用者

时间:2010-02-05 19:09:59

标签: ruby-on-rails ruby activerecord rails-models

让我解释一下我的问题:

我有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)

这很完美,我的问题是我想在is_contact中访问@user的属性?联系方式。

这可能吗?

感谢所有人。

2 个答案:

答案 0 :(得分:3)

简短回答: 你不需要is_contact?,因为ActiveRecord已经定义了一个大概符合你想要的方法:exist?

  @user.contacts.exist? :user_contact_id => a_user_id

除了Contactiduser_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

答案 1 :(得分:2)

如果你想访问@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

编辑:

是的,对,您还需要更改调用此方法的方式。因此,更好的解决方案是使用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的联系人数。