让我解释一下我的问题:
我有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的属性?联系方式。
这可能吗?
感谢所有人。
答案 0 :(得分:3)
简短回答:
你不需要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
答案 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
的联系人数。