3

特定の予定されたコースに関連するすべての請求書を含む @invoices があります。

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">

結果から重複したオブジェクトを削除するにはどうすればよいですか?

4

2 に答える 2

8

:uniqオプションを has many に渡すことができます:

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

このオプションの RoR ドキュメントからの説明は次のとおりです。

true の場合、重複はコレクションから除外されます。:through と組み合わせると便利です。

また、最初から重複が DB に入らないようにするために、次のような一意の DB インデックスを使用できる場合があります。

add_index :enrollments, [:invoice_id, :scheduled_course_id], :unique => true
于 2012-06-07T19:06:29.133 に答える
3
@scheduled_course.invoices.uniq(&:id) # uniq elements in the array by their id

使用するだけ@scheduled_course.invoices.uniqでも機能するはずです。

于 2012-06-07T19:00:49.763 に答える