我正在开发一个 Rails 应用程序(Ruby 1.9.2 / Rails 3.0.3),它会随着时间的推移跟踪人员及其在不同团队中的成员身份。我无法想出一种可扩展的方式来组合重复的 Person 对象。通过“组合”,我的意思是删除除一个重复的 Person 对象之外的所有对象,并更新所有引用以指向该 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
船员.rb
class Crew < ActiveRecord::Base
has_many :rosters
has_many :people, :through => :rosters
end
名册.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
andupdate
操作中,我想实现对重复的 Person 对象的检查,删除重复的对象,然后更新所有的crew
androster
引用以指向剩余的Person
.
.update_all
在每种型号上使用是否安全?这似乎是一种蛮力,特别是因为我将来可能会添加更多依赖于 Person 的模型,而且我不想记住维护 find_duplicate 函数。
谢谢您的帮助!