如何联合表并使结果在 Ruby 视图中可访问



我对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

最新更新