這是一個Rails/ActiveRecord的問題。分配虛擬屬性時出現信令驗證錯誤?
我有一個模型,基本上必須代表事件或表演。每個事件都有許多歸屬地:歸因基本上類似於「在此情況下,個人X具有角色Y」。
我的結論是,最好的方式,讓用戶編輯這個數據是通過提供一個希望將結構化的格式,我會打電話給一個角色串自由文本字段:
singer: Elvis Costello, songwriter: Paul McCartney, ...
我使用自動完成來完成角色名稱(歌手,歌曲作者...)和人名。角色和人員都存儲在數據庫中。
要實現這一點,我創建的事件模型中的虛擬屬性:
def role_string
# assemble a role string from the associations in the model
end
def role_string=(s)
# parse a string in the above role string format,
# look up the People and Events mentioned, and update
# what's in the database
end
這是所有罰款。整個事情工作得很好,當角色字符串格式良好並且角色字符串給出的關聯全部檢出時。
但是,如果角色字符串格式不正確呢?好吧,我想,我只是可以共同使用正則表達式與標準的驗證,以檢查格式:
validates_format_of :role_string, :with => /(\w+:\s*\w+)(,\s*\w+:\s*\w+)*/
但如果該角色串所隱含的關聯是無效的?例如,如果我給出上述角色字符串,並且Elvis Costello
未引用有效的人員,會發生什麼情況?例如,如果給出的名稱之一不匹配任何內容,我認爲,我可以使用屬性:role_string
上的validates_each
來查找關聯並拋出錯誤。
我的問題是兩個:首先,我不喜歡這種方法,因爲爲了驗證關聯性,我將不得不解析字符串並查找它們,這些重複我在role_string=
本身中做的事情,除了實際上將關聯保存到數據庫。
第二,...我如何指出分配給這個虛擬屬性時發生錯誤?