mal*_*tor 7 activerecord ruby-on-rails
我正在查询给定两个用户的共同朋友.下面的查询应该在大多数情况下完成,而友谊表应该是不言而喻的,包含user_id和friend_id.
SELECT `users`.* FROM `users`
INNER JOIN `friendships` `a` ON `users`.`id` = `a`.`friend_id`
INNER JOIN `friendships` `b` ON `users`.`id` = `b`.`friend_id`
WHERE `a`.`user_id` = 1 AND `b`.`user_id` = 2
Run Code Online (Sandbox Code Playgroud)
令我困惑的是如何编写这种语义ActiveRecord.使用ActiveRecord,您可以加入关联,但只能加入一次.那么你如何尽可能明白地写这个ActiveRecord呢?
Hen*_*k N 11
我用字符串参数来做joins:
User.
joins("INNER JOIN friendships a ON users.id = a.friend_id").
joins("INNER JOIN friendships b ON users.id = b.friend_id").
where("a.user_id" => 1, "b.user_id" => 2)
Run Code Online (Sandbox Code Playgroud)
我不知道用Active Record进行这种连接的更高级别的方法.
ald*_*n.h -3
首先,您应该在用户和友谊之间建立适当的模型关系。
user model:
has_many :friendships
friendship model:
belongs_to :user
Run Code Online (Sandbox Code Playgroud)
这样:您可以在迭代中获取activerecords,如下所示:
users = User.all
users.each do |user|
user.friendships
.....
end
Run Code Online (Sandbox Code Playgroud)
或者,按特定用户,例如:
user = User.first
user.friendships #returns association
or
User.first.friendships
Run Code Online (Sandbox Code Playgroud)
对于2 个特定用户(给定),您可以这样做:
User.where(id: [1,2]) #array of user id, then get the friendship record as above.
Run Code Online (Sandbox Code Playgroud)
希望这可以帮助!
| 归档时间: |
|
| 查看次数: |
3041 次 |
| 最近记录: |