0

私はこれらのモデルを持っています:

class Relationship < ActiveRecord::Base
  belongs_to :student
  belongs_to :guardian
end

class Student < ActiveRecord::Base
  has_many :relationships
  has_many :guardians, through: :relationships
end

class Guardian < ActiveRecord::Base
  has_many :relationships
  has_many :students, through: :relationships
end

どの保護者も一人の生徒と何度も関わりたくない。これは検証で防ぐことができますが、手遅れであり、これが発生している場合があるとしましょう。たとえばg、ガーディアンはどこにありますか:

g.relationships

[
    [0] #<Relationship:0x0000000bc33650> {
                          :id => 40321,
        :relationship_type_id => 2,
                  :student_id => 41700,
                 :guardian_id => 45820,
                  :created_at => Tue, 23 Apr 2013 17:44:29 UTC +00:00,
                  :updated_at => Tue, 23 Apr 2013 17:44:29 UTC +00:00,
    },
    [1] #<Relationship:0x0000000bc32e80> {
                          :id => 40923,
        :relationship_type_id => 2,
                  :student_id => 41700,
                 :guardian_id => 45820,
                  :created_at => Tue, 23 Apr 2013 18:58:46 UTC +00:00,
                  :updated_at => Tue, 23 Apr 2013 18:58:46 UTC +00:00,
    }
]

ご覧のとおり、これら 2 つの関係は同じ Student_id を共有しています。重複した関係をデータベースから削除できる方法があるかどうかを知りたいです。次のコード行を試してみましたが、役に立ちませんでした。

g.relationships.uniq!(&:student_id)
g.update_attributes(relatioships: g.relationships.uniq!(&:student_id))

どうすればこの問題を解決できますか。ありがとう!

4

1 に答える 1

0
subquery = Relationship.select("student_id, guardian_id").
             group(:student_id, :guardian_id).
             having("count(*) > 1").to_sql
groups = Relationship.joins("JOIN (#{subquery}) sub ON relationships.student_id = sub.student_id AND relationships.guardian_id = sub.guardian_id").
                      group_by{|r| [r.student_id, r.guardian_id] }

groups.values.each do |duplicates|
  duplicates.drop(1).each(&:destroy)
end
于 2013-04-25T17:19:28.827 に答える