从多个模型中提取(按照添加到Feed中的时间排序)

时间:2018-03-07 16:53:42

标签: ruby-on-rails

我正在使用一个简单的Rails书签应用程序,该应用程序允许用户保存项目并将其组织在集合中。

我想添加一个索引页面,其中包含包含所选项目和收藏集的人员选择。结果将是这些项目和集合在被选为人员选择时(而不是最初创建时)的排名。

这是我到目前为止所拥有的:

Feed模型

class Feed < ApplicationRecord
  has_many :feed_entries, dependent: :destroy
  has_many :items, through: :feed_entries
  has_many :collections, through: :feed_entries
end

Feed Feed Model

class FeedEntry < ApplicationRecord
  belongs_to :item
  belongs_to :collection
  belongs_to :feed 
end

项目模型

class Item < ApplicationRecord
  has_many :feed_entries, dependent: :destroy
  has_many :feeds, through: :feed_entries
  accepts_nested_attributes_for :feeds
end

收藏模式

class Collection < ApplicationRecord
  has_many :feed_entries, dependent: :destroy
  has_many :feeds, through: :feed_entries
  accepts_nested_attributes_for :feeds
end

供稿控制器

class FeedsController < ApplicationController
    def index
        @feed = Feed.find_by(feed_name: 'staffpicks')
        @feed_items = @feed.items.includes(:feed_entries).order('feed_entries.created_at DESC')
        @feed_collections = @feed.collections.includes(:feed_entries).order('feed_entries.created_at DESC')
   end
end

所以在这一点上,我能够列出按选择时间排序的员工挑选的项目和集合。但我无法弄清楚如何将两者结合起来。

@everything = (@feed_collections + @feed_items)

我试过这个,但我无法在数组上使用 order ,当我追加 .sort_by(&amp;:created_at)时,它会被创建排序相应项目和集合的日期 - 而不是它们何时被添加到数组中。

我有什么想法可以解决这个问题吗?

非常感谢提前。我是编程和Rails的新手,所以非常感谢您的反馈:)

2 个答案:

答案 0 :(得分:0)

只需使用feed_entries关联。

@feeds = feed_entries.includes(:item,:collection).order(“feed_entries.created_at desc”)

答案 1 :(得分:0)

class Feed < ApplicationRecord
  has_many :feed_entries, dependent: :destroy,
     -> { order(created_at: :desc) }
  has_many :items, through: :feed_entries
  has_many :collections, through: :feed_entries
end

class FeedEntry < ApplicationRecord
  belongs_to :item, optional: true
  belongs_to :collection, optional: true
  belongs_to :feed 

  def entry
    item || collection
  end
end

@feed = Feed.eager_load(feed_entries: [:item, :collection]).find(1)
@entrees = @feed.feed_entries.map(&:entry)

您还应该考虑将其设置为polymorphic association而不是使用两个不同的外键,因为这样可以将项目和集合视为单一的同源关联。