我該如何去做這件事?我想通過它的子節點上的屬性對選擇父模型進行排序。父母模型與孩子有很多關係。我不確定如何形成ActiveRecord查詢來獲取此信息。Ruby on Rails按子屬性訂購父母模型
示例:線程有很多帖子。我想抓取最近發佈的帖子排序的線程集合。
我發現了一些將選擇轉換爲數組並對數組進行排序的解決方案,但我需要將選擇保留爲ActiveRecord選擇,這樣我才能繼續將查詢鏈接到它。
我該如何去做這件事?我想通過它的子節點上的屬性對選擇父模型進行排序。父母模型與孩子有很多關係。我不確定如何形成ActiveRecord查詢來獲取此信息。Ruby on Rails按子屬性訂購父母模型
示例:線程有很多帖子。我想抓取最近發佈的帖子排序的線程集合。
我發現了一些將選擇轉換爲數組並對數組進行排序的解決方案,但我需要將選擇保留爲ActiveRecord選擇,這樣我才能繼續將查詢鏈接到它。
,我需要你的數據庫的佈局的詳細信息,以提供更好的例子,但可以通過該表像這樣加入另一個表,然後順序:
Thread.joins(:posts).order("posts.created_at").group("threads.id")
只用簡單的查詢,以沒有直接的迭代過數組,你可以這樣做:
Post.joins(:thread).includes(:thread).order("posts.created_at").group("thread_id").take(5)
# Maybe you can take only a few samples of your collection to show on Last Posted Topics,
# then you just replace take(5) with the number of posts you want to take.
我正在嘗試使用線程,而不是帖子。 – followfung
然後你可以在代碼末尾貼上''''.map(&:thread).uniq''' –
對於你的榜樣,這將是更爲有效簡單地讓學生接觸到父:
class Thread < ActiveRecord::Base
has_many :posts
end
class Post < ActiveRecord::Base
belongs_to :thread,
touch: true
end
無論何時創建或更改帖子,這將更改Thread的updated_at列,以便當時認爲線程已更新。您可能需要在一個更復雜的示例中實際訪問子記錄,但對於根據子帖子的日期排序,這可以節省您不必從數據庫中獲取額外記錄的情況,而實際上並不需要該表中的信息。
感謝您的輸入。實際上下文實際上比我的例子稍微複雜一些。 我實際上正在做你現在提出的建議,但是當我更新線程特有的屬性時會出現問題,但我想按最近的帖子排序。基本上我希望最新的Post優先,而不是按updated_at屬性排序。 – followfung
父母與孩子之間的關係是一個簡單的有很多關係。 – followfung
爲什麼這不起作用? – zarazan
PG ::錯誤:錯誤:列「threads.created_at」必須出現在GROUP BY子句中或用於聚合函數 – followfung