【问题标题】:Rails 4 x paper_trail: filter versions by item_id with nested resourcesRails 4 x paper_trail:使用嵌套资源按 item_id 过滤版本
【发布时间】:2015-11-14 02:35:14
【问题描述】:

在我的 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

按照the documentation 中的说明,我安装了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 belong_to 一个calendar 那个belong_to 那个current_user,或者不是)。

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

  • 所有相关的版本
  • 所有帖子来自
  • 属于的所有日历
  • @用户

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

但这似乎很繁重,不符合 Rails 的做事方式。

知道我应该如何进行吗?

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-4 activerecord nested-resources paper-trail-gem


    【解决方案1】:

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

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

    【讨论】:

    • 感谢您的回答。这部分有效。好处:它会过滤帖子,并且只显示属于当前用户的日历的帖子的版本。剩下的问题:一旦我们销毁一个帖子,该帖子的所有对应版本也会消失。知道如何改进吗?
    • @ThibaudClement 我认为说它“部分有效”是不对的。我的回答完全解决了您问题的原始范围,新的说明超出了原始问题的范围。请用您的新问题创建新问题。也考虑接受答案,因为它解决了过滤问题
    • 很公平。我在这里创建了一个新问题:stackoverflow.com/questions/33722350/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-02
    相关资源
    最近更新 更多