私は Rails アプリ (Ruby 1.9.2 / Rails 3.0.3) に取り組んでおり、人々とそのメンバーシップをさまざまなチームに経時的に追跡しています。重複する Person オブジェクトを結合するスケーラブルな方法を考え出すのに苦労しています。「結合」とは、重複する Person オブジェクトを 1 つを除いてすべて削除し、その 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
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
オブジェクトは名前と姓だけで作成できますが、(社会保障番号のようなものと考えてください) と呼ばれる真に一意のフィールドが 1 つあり、オプションでまたはアクションiqcs_num
に格納できます。create
update
したがって、create
andupdate
アクション内で、重複する Person オブジェクトのチェックを実装し、重複を削除してから、残りの を指すようにすべてのcrew
and参照を更新したいと思います。roster
Person
.update_all
各モデルで安全に使用できますか? 特に、将来的に Person に依存するモデルを追加する可能性が高く、find_duplicate 関数を維持することを覚えておく必要がないため、これは一種の強引な方法のように思えます。
助けてくれてありがとう!