2012-12-20 88 views
4

給定一個模型發佈has_many附件,並且附件具有隱藏標誌。在整個應用程序,我想輕鬆地說post.attachments,只得到了看得見的,所以我安裝的附件模型默認範圍(使用squeel):覆蓋active_admin中的默認範圍form.has_many

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

但管理頁面需要能夠看到一個帖子的所有附件,而不僅僅是可見的附件(所以你可以切換隱藏的複選框)。這樣做(在管理/ posts.rb)的默認方式採用default_scope,只讓我編輯可見的:

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

我知道我可能只是不使用default_scope,而是命名爲:可見,然後到處(除了管理頁面)說post.attachments.visible,但我更喜歡沒有這樣做。

如何在管理頁面上查看兒童附件?

回答

8

這是我摸索出瞭解決方案:

在應用程序/管理/ posts.rb

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

而且在應用程序/模型/ posts.rb

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

(其中附件模型belongs_to::attachable,polymorphic:true)

這是怎麼回事? ActiveAdmin使用Formtastic,它使用Rails Form Builder。 form.has_many方法是一個ActiveAdmin方法,該方法調用Formtastic的form.inputs,後者又調用Rails的fields_for。 :for選項會一直沿着fields_for傳遞,這可能需要一個集合(作爲其第二個參數),因此我將該集合明確地傳遞給它。