将一些SQL查询转换为活动记录

时间:2012-08-04 23:20:35

标签: sql ruby-on-rails ruby activerecord

所以,我有这个“高级”查询(实际上并不多),我想把它翻译成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个模型:MicropostsUsersRelationships

  • Relationships是一个处理所有用户关系的联接表(关注者/关注者)。
  • 用户通过关系有许多follow_users / followers。
  • 用户有很多微型用户,微型用户有一个用户。

感谢。

4 个答案:

答案 0 :(得分:1)

您的查询非常具体,因此您最好的选择是使用SQL编写其中的大部分内容,或尝试使用squeel之类的gem来帮助从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")

答案 1 :(得分: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

答案 2 :(得分:1)

我的回答是假设(因为你在原始SQL查询之外没有提供ruby / rails-context)你有一个User模型,一个Micropost模型通过关系:micropostsRelationship模型通过关系: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应用程序中提到的上述可能的关系,听起来类似的东西应该有效。

答案 3 :(得分: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)

不知道这有多好,但似乎有效。