的Rails 3:从数据库

问题描述:

我有这些模型删除重复的关联:的Rails 3:从数据库

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, 
    } 
] 

正如你可以看到,这两个关系共享相同的student_id数据。我想知道是否有办法从数据库中删除重复的关系。我试过以下几行代码无济于事:

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

我该如何解决这个问题。谢谢!

+0

是否有任何规则应该保留哪些副本应该保留(最近的,最早的,其他的),或者它并不重要?另外,你想要SQL或Ruby代码呢? – PinnyM 2013-04-25 17:05:01

+0

没有规则,如果有两种相同的类型,他们中的任何一个都适合我 – sauronnikko 2013-04-25 17:06:06

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