我正在使用一个简单的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的新手,所以非常感谢您的反馈:)
答案 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而不是使用两个不同的外键,因为这样可以将项目和集合视为单一的同源关联。