2012-06-07 62 views
3

我有@invoices,其中包含与特定预定课程有关的所有发票。Rails 3.如何从查询结果中删除重复的关联记录?

scheduled_course has_many :invoices, through => :enrollments 
invoices belongs_to :scheduled_courses 

@scheduled_course = ScheduledCourse.find(params[:id]) 
@invoices = @scheduled_course.invoices 

现在,一些发票可能会被复制。例如,@invoices - @scheduled_course.invoices可能输出...

=> [#<Invoice id: 85, company_id: 106, invoice_number: "2870", issued_on: "2012-03-27", status: "pagado", notes: "", created_at: "2012-05-02 15:28:13", updated_at: "2012-05-02 15:50:50", exchange_rate: #<BigDecimal:c2bcc9c,'0.12E2',4(8)>, student_id: nil, due_date: "2012-04-02">, 
#<Invoice id: 85, company_id: 106, invoice_number: "2870", issued_on: "2012-03-27", status: "pagado", notes: "", created_at: "2012-05-02 15:28:13", updated_at: "2012-05-02 15:50:50", exchange_rate: #<BigDecimal:c2b828c,'0.12E2',4(8)>, student_id: nil, due_date: "2012-04-02">, 
#<Invoice id: 85, company_id: 106, invoice_number: "2870", issued_on: "2012-03-27", status: "pagado", notes: "", created_at: "2012-05-02 15:28:13", updated_at: "2012-05-02 15:50:50", exchange_rate: #<BigDecimal:c2b7e54,'0.12E2',4(8)>, student_id: nil, due_date: "2012-04-02">, 
#<Invoice id: 85, company_id: 106, invoice_number: "2870", issued_on: "2012-03-27", status: "pagado", notes: "", created_at: "2012-05-02 15:28:13", updated_at: "2012-05-02 15:50:50", exchange_rate: #<BigDecimal:c2b7a1c,'0.12E2',4(8)>, student_id: nil, due_date: "2012-04-02">, 
#<Invoice id: 85, company_id: 106, invoice_number: "2870", issued_on: "2012-03-27", status: "pagado", notes: "", created_at: "2012-05-02 15:28:13", updated_at: "2012-05-02 15:50:50", exchange_rate: #<BigDecimal:c2b75e4,'0.12E2',4(8)>, student_id: nil, due_date: "2012-04-02">, #<Invoice id: 85, company_id: 106, invoice_number: "2870", issued_on: "2012-03-27", status: "pagado", notes: "", created_at: "2012-05-02 15:28:13", updated_at: "2012-05-02 15:50:50", exchange_rate: #<BigDecimal:c2b7198,'0.12E2',4(8)>, student_id: nil, due_date: "2012-04-02"> 

如何从结果中移除重复的对象?

+1

你就不能打电话uniq呢? – Sean

+0

使用uniq会将查询转换为数组,这可能会对性能产生负面影响。 – yagooar

回答

8

您可以通过:uniq选项有很多:

has_many :invoices, :through => :enrollments, :uniq => true 

下面是RoR的文档此选项的说明:

如果为真,重复将从收集被省略。与...一起使用。

此外,为了避免在第一时间进入DB副本,您可以使用一个独特的数据库索引,这可能是这个样子:

add_index :enrollments, [:invoice_id, :scheduled_course_id], :unique => true 
+0

我喜欢这个解决方案。 – Kyle

+0

该解决方案将在Rails 4.0中被弃用,甚至可能在Rails 4.1中不存在,所以鼓励使用替代lambda版本:has_many:invoices, - > {#get unique elements},:through =>:enrollments – yagooar

3
@scheduled_course.invoices.uniq(&:id) # uniq elements in the array by their id 

只使用@scheduled_course.invoices.uniq也应该工作。

+0

请记住,#uniq会将ActiveRecord关联转换为发票数组,这会对获取元素所需的性能和时间产生负面影响。 – yagooar

+0

是的,使用'distinct'代替。 –

相关问题