我想合併一個步驟來檢查現有的關係對象作爲我的模型創建/表單提交過程的一部分。例如,假設我有一個Paper
型號has_and_belongs_to_many :authors
。在我的「創建紙張」表單上,我想要authors_attributes
字段爲:name
,然後在我的create
方法中,首先查找該作者是否存在於「數據庫」中;如果是,則將該作者添加到論文的authors
,如果不是,則執行初始化新作者的正常authors_attributes
步驟。如何使用first_or_initialize與accept_nested_attributes_for`步驟 - Mongoid
基本上,我想這樣做:
# override authors_attributes
def authors_attributes(attrs)
attrs.map!{ |attr| Author.where(attr).first_or_initialize.attributes }
super(attrs)
end
但這並不爲許多原因工作(它弄亂了該方法的Mongoid的定義,你可以不包括id
在_attributes
中,除非它已經在型號中註冊)。
我知道處理這些類型情況的首選方法是使用「表單對象」(例如,與Virtus一起)。但是,我有點反對這種模式,因爲它需要重複字段定義和驗證(至少據我瞭解)。
有沒有簡單的方法來處理這種行爲?我覺得它必須是一個常見的情況,所以我必須失去了一些東西......
感謝您的回答。當我需要查找和添加新的作者時,我想我可以做類似'author_ids'和'author_attributes'的單獨字段,但我不知道當它涉及到實際的記錄/關聯時它會發揮多大作用節約過程。我可能會做一些像http://stackoverflow.com/questions/4164185/accepts-nested-attributes-for-to-link-to-existing-record-not-create-a-new-one,雖然它是一種的黑客,我還沒有證實它會與Mongoid一起使用。你的是最好的答案,所以賞金是你的。 –