我目前正在开发一个小型社交网络应用程序,现在我正在尝试创建一个代表用户之间友谊的模型.这是我到目前为止提出的:
class User < ActiveRecord::Base
# ...
has_many :friendships
has_many :friends, :through => :friendships
end
class Friendship < ActiveRecord::Base
belongs_to :user
belongs_to :friend, :class_name => 'User'
end
Run Code Online (Sandbox Code Playgroud)
我的友谊模型有一个确认为布尔值的字段,我想用它来定义一个待定或确认的友谊.
如何访问特定用户的所有待处理请求?我可以使用Rails的范围方法以某种方式定义它吗?就像是
current_user.friendships.requests # => [Friendship, Friendship, ...]
Run Code Online (Sandbox Code Playgroud)
会很好.
如何使这种关联双向化?一旦确认了朋友请求,我就会添加另一个友谊,这样我的友谊表看起来就像这样:
| user_id | friend_id | confirmed |
-----------------------------------
| 1 | 2 | true |
| 2 | 1 | true |
Run Code Online (Sandbox Code Playgroud) 用雄辩的方式塑造友谊关系的最佳方式是什么?我的表架构在下面,我想定义一个关系,我可以检索所有的朋友,如下所示.
<?php
class User extends Eloquent {
public function friends() {
return $this->belongsToMany('User', 'friendships', 'user_id', 'friend_id')->orWhere($this->id,'=', 'friend_id');
}
}
+----+---------+-----------+----------+---------------------+---------------------+
| id | user_id | friend_id | state | created_at | updated_at |
+----+---------+-----------+----------+---------------------+---------------------+
| 1 | 3 | 1 | accepted | 0000-00-00 00:00:00 | 0000-00-00 00:00:00 |
| 2 | 2 | 3 | accepted | 0000-00-00 00:00:00 | 0000-00-00 00:00:00 |
+----+---------+-----------+----------+---------------------+---------------------+
Run Code Online (Sandbox Code Playgroud)
当我寻找用户ID为3的朋友时,上面的关系接近工作我得到了用户1和3,但显然我想要1和2.
友谊表
user_id:请求友情
friend_id的用户ID:目标朋友
状态的用户ID :友谊是待处理,被接受还是被阻止.
created_at和updated_at
我知道有很多来自Laravel的解决方案许多自我引用表只能以一种方式工作,我可以从关系的两边检索朋友,但我必须是两行,例如,如果用户1和3是朋友,那么在一行user_id = …