0

让我解释一下我的问题:

我有 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,你可以检查 is_contact? 像这样:

@user.contacts.is_contact?(a_user_id)

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

这可能吗?

谢谢大家。

4

2 回答 2

3

简短的回答:你不需要is_contact?,因为 ActiveRecord 已经定义了一个方法,可以大致完成你想要的:exist?

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

除了,和Contact之外还有它自己的属性吗?如果没有,您最好使用 has 和 belongs to many 关联。iduser_iduser_contact_id

我觉得使用类似的东西@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
于 2010-02-05T21:22:03.233 回答
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

于 2010-02-05T19:26:02.493 回答