所以,我有这个“高级”查询(实际上并不多),我想把它翻译成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
。
感谢。
答案 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
模型通过关系:microposts
和Relationship
模型通过关系:following
。 User
有许多相关的Micropost
和Relationship
个实例。你可以做到
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)
不知道这有多好,但似乎有效。