2

所以,我有这个“高级”查询(真的不多),我想把它翻译成 Ruby Active Record 的语法。

SELECT microposts.* 
FROM microposts
WHERE user_id IN 
      ( SELECT r.followed_id as uid 
        FROM relationships r 
        WHERE follower_id = 1 
      UNION 
        SELECT u.id as uid 
        FROM users as u 
        WHERE id = 1
      ) 
ORDER BY microposts.created_at DESC

想法是检索用户 1 的所有微博,用户 1 以 desc 创建顺序跟随用户,但我真的不知道如何使用 Active Record 的语法轻松翻译。

任何想法 ?

PS:这里问的是一些rails上下文:

我有 3 个模型:Microposts, Users, Relationships.

  • 关系是处理所有用户关系(关注者/关注者)的连接表。
  • 用户通过关系有很多followed_users/followers。
  • 用户有许多微箍,而微箍有一个用户。

谢谢。

4

4 回答 4

1

您的查询非常具体,因此最好的办法是使用 SQL 编写其中的大部分内容,或者尝试使用类似的 gemsqueel来帮助从 ActiveRecord 生成非常定制的 SQL。

尽管如此,这应该可以在没有额外宝石的情况下完成工作:

user_id = ... #Get the user_id you want to test
Micropost.where("user_id IN 
  ( SELECT r.followed_id as uid 
    FROM relationships r 
    WHERE follower_id = ? )
  OR user_id = ?
  ", user_id, user_id).order("created_at desc")
于 2012-08-04T23:28:58.960 回答
1

不了解 Ruby,但 SQL 可以简化为:

SELECT microposts.* 
FROM microposts
WHERE user_id IN 
      ( SELECT r.followed_id as uid 
        FROM relationships r 
        WHERE follower_id = 1 
      ) 
   OR user_id = 1
ORDER BY microposts.created_at DESC
于 2012-08-04T23:43:00.753 回答
1

我的回答将假设(因为您在原始 SQL 查询之外没有提供 ruby​​/rails-context)您有一个User模型、一个Micropost通过关系的模型:microposts和一个Relationship通过关系的模型:followingUser有很多MicropostRelationship实例相关的。你可以做

u = User.find(1)
user.microposts + user.following.microposts

或者你可以把它移到一个方法中Micropost

def self.own_and_following(user)
  user.microposts + user.following.microposts      
end

并调用Micropost.own_and_following(User.find(1))

这可能不是您要寻找的,但鉴于上述您在 Rails 应用程序中可能存在的关系,听起来与此类似的东西应该可以工作。

于 2012-08-04T23:52:35.143 回答
0

我设法只使用 where 来做到这一点,对我来说似乎很像 find_by_sql,我不知道哪个会更好:

Micropost.order('created_at DESC').
where('user_id in (select r.followed_id as uid from relationships as r where follower_id = ?) or user_id = ?', user.id, user.id)

不知道这有多好,但它似乎工作。

于 2012-08-06T14:52:15.327 回答