2016-02-11 20 views
0

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

回答

1

当前活动记录缺少工会支持。您可以使用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 
+0

谢谢!我昨天花了几个小时没有运气。这像一个魅力。我使用了你的答案,并查找了'select_all'来查看如何传递参数,最后一行代码如下:'ActiveRecord :: Base.connection.select_all(ActiveRecord :: Base.send(“sanitize_sql_array “,[sql,self.id,self.id]))' – Monica

0

你要做到这一点是如果你希望所有的属于用户的朋友的东西只使用Rails的

动力的最佳方式:

current_user.friends.find(id_of_friend).first.questions 

这将得到某个朋友的所有问题。

现在,您似乎在多个地方都有作品(如果没有您提供作品与其他地方的连接模型,这很难形象化)。你能提供这个吗?

+0

我已经更新了原来的职位与一些澄清在第2段。我以为我准确地描述了表格和模型,让我知道什么会更有助于澄清。 – Monica

+0

此外,我正在寻找所有当前用户的朋友(不只是一个朋友)写的所有问题。以及所有当前用户的朋友编写的所有图片。并以某种方式将这两个合并到一个列表中,以便按日期按DESC顺序排序。 – Monica

0
@blurbs = Blurb.includes(:user) 

@blurbs.each do |blurb| 
    p blurb.blurb, blurb.user.username 
end 
+0

这很棒,而且我在别处也见过。我需要复杂的*和*问题(两个具有不同列名称的不同表格)增加了复杂性。并且将这两个网格组合在一起,以便它们按updated_at对DESC进行排序。 – Monica

相关问题