4

给定一个具有多个附件的模型 Post,并且附件具有隐藏标志。在整个应用程序中,我想轻松地说 post.attachments 并且只获取可见的,所以我在 Attachment 模型中设置了一个默认范围(使用 squeel):

default_scope -> { where { (hidden != true) | (hidden == nil) } } 

但是管理页面需要能够查看帖子的所有附件,而不仅仅是可见的附件(这样您就可以切换隐藏的复选框)。这样做的默认方式(在 admin/posts.rb 中)使用 default_scope 并且只允许我编辑可见的:

f.has_many :attachments do |a|
  ...
end

我知道我不能使用 default_scope 而是将其命名为 :visible,然后在任何地方(管理页面除外)都说 post.attachments.visible,但我不想这样做。

如何在管理页面上取消子附件的范围?

4

1 回答 1

8

这是我制定的解决方案:

在 app/admin/posts.rb

f.has_many :attachments, for: [:attachments, f.object.attachments_including_hidden] do |a|
  ...
end

在 app/models/posts.rb

def attachments_including_hidden
  Attachment.unscoped.where( attachable_id: id )
end

(其中附件模型属于_to: :attachable, polymorphic: true )

这是怎么回事?ActiveAdmin 使用 Formtastic,后者使用 Rails Form Builder。form.has_many 方法是一个 ActiveAdmin 方法,它调用 Formtastic 的 form.inputs,而后者又调用 Rails 的 fields_for。:for 选项将一直传递到 fields_for 中,它可以接受一个集合(作为它的第二个参数),所以我明确地将这个集合传递给它。

于 2012-12-20T20:34:15.720 回答