我正在研究Rails應用程序(Ruby 1.9.2/Rails 3.0.3),該應用程序隨時跟蹤不同團隊的人員及其成員。我遇到了一個可擴展的方法來組合重複的Person對象。 '組合'我的意思是刪除除重複的Person對象之外的所有對象,並更新所有引用以指向該Person的剩餘副本。下面是一些代碼:如何組合重複的rails對象並更新所有引用
型號:
Person.rb
class Person < ActiveRecord::Base
has_many :rostered_people, :dependent => :destroy
has_many :rosters, :through => :rostered_people
has_many :crews, :through => :rosters
def crew(year = Time.now.year)
all_rosters = RosteredPerson.find_all_by_person_id(id).collect {|t| t.roster_id}
r = Roster.find_by_id_and_year(all_rosters, year)
r and r.crew
end
end
Crew.rb
class Crew < ActiveRecord::Base
has_many :rosters
has_many :people, :through => :rosters
end
Roster.rb
class Roster < ActiveRecord::Base
has_many :rostered_people, :dependent => :destroy
has_many :people, :through => :rostered_people
belongs_to :crew
end
RosteredPerson.rb
class RosteredPerson < ActiveRecord::Base
belongs_to :roster
belongs_to :person
end
Person
對象可以只用一個名字和姓氏創建,但他們有一個真正獨特的領域被稱爲iqcs_num
(認爲它像一個社會安全號碼),它可以任意存儲在任一create
或update
的操作。
所以create
和update
行動中,我想執行重複的Person對象的檢查,刪除重複,然後更新所有crew
和roster
引用指向剩餘Person
。
在每個型號上使用.update_all
是否安全?這似乎是一種蠻橫的力量,尤其是因爲我將來可能會增加更多的依賴Person的模型,而且我不想記住保留find_duplicate函數。
感謝您的幫助!
啊哈!這確實聽起來像是要走的路 - 我只關心更新'dup.crews = dup.crews + self。由於更多的關聯與「人」模型相關聯,因此「船員」聲明將成爲維護此站點的經典「難題」。但我想這是我需要記錄的東西......感謝您的幫助! – evanhsu
...我可能會把這個與['reflect_on_all_associations'](http://apidock.com/rails/ActiveRecord/Reflection/ClassMethods/reflect_on_all_associations)方法的更多研究結合起來... – evanhsu