Ruby on Rails Active Record Associations,我如何做到确认友谊(比如在facebook上)

时间:2016-04-07 04:18:44

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

我研究RoR并做像facebook这样的应用程序。 1个用户向2个用户发送请求以获取友谊。第二个用户确认他们将成为朋友的友谊

请告诉我,我能做的更简单,我需要。

我有: 表:

1. users
:id
:email
 (has_many :friendships, foreign_key: 'requester_id', dependent: :destroy
  has_many :requesters, through: :friendships, source: :requester
  has_many :responders, through: :friendships, source: :responder)
2. friendships
:id
:requester_id
:responder_id
 (belongs_to :requester, class_name: "User"
  belongs_to :responder, class_name: "User"
  has_one   :confirm_friendship)
3. confirm_friendships
:friendship_id
:confirm
 (belongs_to :friendship)

That users have friendship i do:
u1 = User.first
u2 = User.second
u1.friendships.create!(responder_id: other_user.id)
fr = Friendship.find_by(requester_id: u1.id, responder_id: u2.id)
conf = ConfirmFriendship.create(friendship_id: fr.id, confirm: true)

抱歉我的英文。非常感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

看看一些基于Rails的开源社交网络'在Github上。这是Diaspora User模型的链接(https://github.com/diaspora/diaspora/blob/develop/app/models/user.rb),为学习提供了一个很好的例子。

如果您正在寻找最简单的实现,我会说您可以尝试以下方法,您可以取消confirm_friendships模型并在friendships表上放置一个confirmed?布尔列。

friendships.confirmed?设置为默认值为false,只有响应者接受后才会将其设置为true

然后,您可以使用以下范围过滤user.friendships

scope :confirmed, -> { where("friendships.confirmed? = ?", true) }

分离哪些朋友处于确认状态,哪些朋友不处于确认状态。

也许你可以用这些方面的东西简化模型?

User
has_many: friendships

Friendships
belongs_to :requester, class_name: "User"
belongs_to :responder, class_name: "User"

它可能过于简化,但我希望这个答案中的某些内容对您有用。