Avi*_*try 7 sql activerecord ruby-on-rails
我有2个型号
class User < AR
has_many :friends
end
class Friend < AR
# has a name column
end
Run Code Online (Sandbox Code Playgroud)
我需要找到所有与'Joe'和'Jack'都是朋友的用户
知道我怎么能在铁轨上做到这一点?
一种选择是将每个名称作为各个 INNER JOINS 的参数。在 SQL 中,它会是这样的:
SELECT users.* FROM users
INNER JOIN friends AS f1
ON users.id = f1.user_id
AND f1.name = 'Joe'
INNER JOIN friends AS f2
ON users.id = f2.user_id
AND f2.name = 'Jack'
Run Code Online (Sandbox Code Playgroud)
由于它是 INNER JOINS,因此它只会显示 users 表可以同时使用 f1 和 f2 连接的结果。
要在 Rails 中使用它,也许可以这样做:
class User < AR
has_many :friends
def self.who_knows(*friend_names)
joins((1..friend_names.length).map{ |n|
"INNER JOIN friends AS f#{n} ON users.id = f#{n}.user_id AND f#{n}.name = ?" }.join(" "),
*friend_names)
})
end
end
Run Code Online (Sandbox Code Playgroud)
然后你可以这样调用:
@users = User.who_knows("Joe", "Jack")
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
597 次 |
| 最近记录: |