2012-08-04 64 views
2

因此,我有这个“高级”查询(没有太多,真的),我想将它翻译成Ruby Active Record的语法。将一些SQL查询转换为活动记录

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,随后在递减顺序创建用户,但我真的不知道如何翻译这个容易使用Active Record的语法。

有没有想法?

PS:由于要求在这里是一些轨道方面:

我有3种型号:MicropostsUsersRelationships

  • 关系是一个处理所有用户关系(follower/follow stuff)的连接表。
  • 用户通过关系有很多follow_users/followers。
  • 用户有很多microhoops,microhoops有一个用户。

谢谢。

+0

感谢您的可读性修复,ypercube :) – 2012-08-05 00:14:50

回答

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

关于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 
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应用程序中提到的上述可能关系,听起来像是类似于此的应该起作用。

+0

哦,对不起,我完全忘了指定我的模型和关联。但你是对的,我会纠正它。 – 2012-08-05 00:12:12

+0

但这不是我正在寻找的,因为这会给我用户的微博,然后按顺序跟随用户微博。我需要所有用户和用户的关注用户microposts按日期分配。在某种程度上,拉叽叽喳喳,脸谱等。 – 2012-08-05 00:14:10

+0

AREL是否将'+ +'转换为UNION? – 2012-08-06 15:10:52

0

我只得到使用,其中,看起来很像的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) 

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