Facebook喜欢请求模型。具有相同型号的多对多

时间:2014-08-30 09:39:04

标签: ruby-on-rails ruby-on-rails-4

我有一个用户模型:

class User < ActiveRecord::Base
has_many :sent_requests, :foreign_key => :sender_id, :class_name => "Request"
has_many :recieved_requests, :foreign_key => :recipient_id, :class_name => "Request"

和请求模型:

class Request < ActiveRecord::Base
belongs_to :sender, class_name: "User", :source => "sender_id"
belongs_to :recipient, class_name: "User", :source => "recipient_id"

我正在努力理解以下方面的区别:foreign_key,:through,:source,:class_name等。

这似乎与大多数教程示例略有不同,因为用户可以属于双方的关系(尽管不是同时)。

有关如何使其正常工作的任何建议。更重要的是如何思考这种关系?

供参考: 我的Request模型只有sender_id,recipient_id和accepted:boolean。

1 个答案:

答案 0 :(得分:0)

以下是我正在使用的内容:

在用户的模型中:

has_many    :sent_requests,
            :class_name => "Request",
            :foreign_key => "sender_id"

has_many    :received_requests,
            :class_name => "Request",
            :foreign_key => "receiver_id"

在请求的模型中:

belongs_to :sender,
         :class_name => "User"

belongs_to :receiver,
         :class_name => "User"

请注意,我们用户:class_name指定类的名称,当rails无法推断出类的名称时。如果你说: has_many:请求 那么你不需要包含类名。 Rails会自动知道它是Request。但是如果你想重命名:request to like like:sent_request,你需要指定类。

另请注意,默认情况下,外键是带有“_id”后缀的关联名称。因此,定义belongs_to:person关联的类将使用“person_id”作为默认值:foreign_key。如果使用的名称不符合rails命名约定,则需要指定foreign_key。