2013-12-23 35 views
0

我有一個模型,其中很小比例的對象將具有相當大的描述性文本。爲了保持我的數據庫的規範化,我想將這個描述性文本提取到單獨的模型中,但是在ActiveAdmin中創建合理的工作流程時遇到了問題。在ActiveAdmin中編輯has_one關聯 - 當屬性空白時銷燬

我的模式是這樣的:

class Person < ActiveRecord::Base 
    has_one :long_description 

    accepts_nested_attributes_for :long_description, reject_if: proc { |attrs| attrs['text'].blank? } 
end 

class LongDescription < ActiveRecord::Base 
    attr_accessible :text, :person_id 
    belongs_to :person 

    validates :text, presence: true 
end 

目前,我已經創建了一個表單編輯Person模型,有些看起來像這樣:

form do |f| 
    ... 
    f.inputs :for => [ 
         :long_description, 
         f.object.long_description || LongDescription.new 
        ] do |ld_f| 
     ld_f.input :text 
    end 

    f.actions 
    end 

這適用於添加/編輯LongDescription對象,如果沒有文本輸入,它會驗證/創建LongDescription對象。

我想要實現的是也能夠刪除LongDescription對象,例如,如果text屬性曾被設置爲空字符串/ nil。

任何有比我更好的Rails或ActiveAdmin技能的人都知道如何做到這一點?

+0

你'reject_if:reject_if:'在你的榜樣,我以爲是一個錯字? – seanlinsley

+0

如果你有'validates_presence_of:text',你的數據庫不應該處於'text'屬性爲零的狀態。 – seanlinsley

+0

是的,對不起。這是一個錯字。 – rogerkk

回答

1

這似乎是一個非常獨特的建築的決定,但執行是非常簡單的:

class LongDescription < ActiveRecord::Base 

    validates_presence_of :text, on: :create 

    after_save do 
    destroy if text.blank? 
    end 
end 
+0

這不會與':reject_if'選項衝突嗎? – rogerkk

+0

這似乎很可能。 'Person'對象不應該爲它的關聯對象進行驗證,所以你應該刪除':reject_if'條件。 – seanlinsley

+0

正如我所提到的,只有很少的Person對象實際上會有一個很長的描述,所以我很想避免每次編輯Person時都創建空的LongDescription對象。 也許我完全在這裏,如你所暗示的。你對於如何解決整個問題有什麼想法嗎? – rogerkk