2016-02-11 47 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

相關問題