我对RoR非常陌生,并且为我正在参加的课程创建一个学生项目。我想构建一种我们在课程中未涉及的查询类型,并且我知道我可以在.NET和SQL中快速完成这些查询。尽管实现了Ruby方式,但我还是有一段时间。如何联合表并使结果在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
和质疑,并Blurb的车型都有belongs_to :user
在视图中,我想显示'UserPost'列和'作者'的内容。我确信这是可能的,对于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
谢谢!我昨天花了几个小时没有运气。这像一个魅力。我使用了你的答案,并查找了'select_all'来查看如何传递参数,最后一行代码如下:'ActiveRecord :: Base.connection.select_all(ActiveRecord :: Base.send(“sanitize_sql_array “,[sql,self.id,self.id]))' – Monica