我对RoR很陌生,正在为我正在学习的课程创建一个学生项目。我想构造一种我们在课程中没有涉及的查询类型,我知道我可以在 .NET 和 SQL 中快速完成。虽然让它以 Ruby 方式实现,但我遇到了一段时间。
我想做的是:在用户页面上显示该用户好友的所有"帖子"的列表。
"帖子"既可以在questions
表中找到,也可以在用户参与的blurbs
表中找到。我想将这两个UNION
到一个记录集中,以按updated_at DESC 进行排序。
然而,表列名称并不相同,这是我的症结所在,因为我看到的其他成功答案取决于两者之间的列名相同。
在SQL中,我会写类似的东西(强调喜欢(:
SELECT b.Blurb AS 'UserPost', b.updated_at, u.username as 'Author'
FROM Blurbs b
INNER JOIN Users u ON b.User_ID = u.ID
WHERE u.ID IN
(SELECT f.friend_id FROM Friendships f WHERE f.User_ID = [current user])
ORDER BY b.updated_at DESC
UNION
SELECT q.Question, q.updated_at, u.username
FROM Questions q
INNER JOIN Users u ON q.User_ID = u.ID
WHERE u.ID IN
(SELECT f.friend_id FROM Friendships f WHERE f.User_ID = [current user])
ORDER BY b.updated_at DESC
用户模型的(适用(关系包括:
has_many :friendships
has_many :friends, through: :friendships
has_many :questions
has_many :blurbs
问题和简介模型都有belongs_to :user
在视图中,我想显示"用户发布"列和"作者"的内容。我相信这是可能的,我对 ActiveRecord 和语句的形成方式还太新了。很高兴有一些意见或查看任何与此相关的链接!
最终解决方案
希望这将在未来帮助其他人解决 Ruby UNION
问题。由于@Plamena的投入,最终实现的结果是:
def friend_posts
sql = "...the UNION statement seen above..."
ActiveRecord::Base.connection.select_all(ActiveRecord::Base.send("sanitize_sql_array",[sql, self.id, self.id] ) )
end
当前活动记录缺乏联合支持。您可以使用 SQL:
sql = <<-SQL
# your sql query goes here
SELECT b.created_at ...
UNION(
SELECT q.created_at
....
)
SQL
posts = ActiveRecord::Base.connection.select_all(sql)
然后,您可以迭代结果:
posts.each do |post|
# post is a hash
p post['created_at']
end
最好的方法是使用 Rails 的强大功能
如果您想要属于用户好友的所有内容:
current_user.friends.find(id_of_friend).first.questions
这将从某个朋友那里得到所有问题。
现在,你似乎在多个地方都有作品(如果没有你提供作品如何与其他任何地方联系起来的模型,这很难想象(。你能提供这个吗?
@blurbs = Blurb.includes(:user)
@blurbs.each do |blurb|
p blurb.blurb, blurb.user.username
end