我有一個複雜的Rails模型設置,我會盡量簡化。此設置的目標是能夠擁有長期存在的對象(Person
,Pet
),但它們之間的關係每年都會通過TemporalLink
更改。基本上,我有這些模型:Rails不會保存,如果重複
class Person < ActiveRecord::Base
include TemporalObj
has_many :pet_links, class_name: "PetOwnerLink"
has_many :pets, through: :pet_links
end
class Pet < ActiveRecord::Base
include TemporalObj
has_many :owner_links, class_name: "PetOwnerLink"
has_many :owners, through: :owner_links
end
class PetOwnerLink < ActiveRecord::Base
include TemporalLink
belongs_to :owner
belongs_to :pet
end
和這些問題:
module TemporalLink
extend ActiveSupport::Concern
# Everything that extends TemporalLink must have a `year` attribute.
end
module TemporalObj
extend ActiveSupport::Concern
# Everything that extends TemporalObj must have a find_existing() method.
####################
# Here be dragons! #
####################
end
期望的行爲是:
當創建一個
TemporalObj
(Pet
,Person
):1)檢查是否有現有的,根據一定的條件,與
find_existing()
。 2)如果找到了現有的副本,請不要執行創建,但仍然對關聯的對象執行必要的創建。 (這似乎是棘手的部分)3)如果沒有找到重複,執行創建。
4)現有的魔力已經自動創建必要的
TemporalLink
對象。]當摧毀一個
TemporalObj
:1)檢查是否在一年以上存在的對象。 (這在實際中比在這個例子中更簡單。)
2)如果對象僅在一年內存在,則銷燬它並關聯
TemporalLink
s。3)如果物體存在一年以上,只要銷燬其中一個
TemporalLink
即可。
我的問題是我有很多TemporalObj
小號獨特性驗證,所以當我嘗試創建一個新的副本,確認之前,我可以執行任何around_create
魔術失敗。任何想法,我怎麼可以爭論這個工作?
有趣的方法。我不喜歡刪除舊對象的想法(它可能會有其他關聯現在被破壞),但是因爲這適用於我給出的示例,並且比我想出的解決方案簡單得多(這非常複雜重寫默認的Rails方法的舞蹈),我會接受它。 – JacobEvelyn