Rails 4 x paper_trail:使用嵌套资源按item_id过滤版本

在我的Rails 4应用程序中,我有以下模型:

class User < ActiveRecord::Base has_many :administrations, dependent: :destroy has_many :calendars, through: :administrations end class Administration < ActiveRecord::Base belongs_to :user belongs_to :calendar end class Calendar < ActiveRecord::Base has_many :administrations, dependent: :destroy has_many :users, through: :administrations end class Post < ActiveRecord::Base belongs_to :calendar end 

我安装了paper_trail gem来跟踪我的post模型的变化,如文档中所述 ,它就像一个魅力。

版本显示在Calendars#Index视图中,该视图用作user的仪表板。

以下是我的CalendarsController的设置方法:

 def index @user = current_user @calendars = @user.calendars.all @comments = @user.calendar_comments.order("created_at DESC").limit(20) @versions = PaperTrail::Version.order('id DESC').limit(10) end 

正如您可能从上面的代码推断出的那样,问题是数据库中的所有版本(至少是最后10个版本)都被拉出,无论它们与哪个post相关(最重要的是,这篇post是否belong_to属于belong_tocalendar current_user ,或不)。

但是,我们想要的是分配给@versions

  • 所有版本都与之相关
  • 所有post来自
  • 所有属于的日历
  • @用户

我正在考虑创建一个包含所有相关post id的数组并将其存储到@posts ,然后将所有版本存储在@versionswhere id包含在@posts数组中。

但这似乎很重,并且与Rails的做事方式不一致。

有关我应该如何进行的任何想法?

您可以使用PaperTrail( item_typeitem_id )提供的对象属性:

 PaperTrail::Version .where(item_type: 'Post', item_id: Post.where(calendar_id: @calendars.ids)) .order('id DESC') .limit(10)