Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 轨道3。如何从查询结果中删除重复的关联记录?_Ruby On Rails_Ruby_Activerecord - Fatal编程技术网

Ruby on rails 轨道3。如何从查询结果中删除重复的关联记录?

Ruby on rails 轨道3。如何从查询结果中删除重复的关联记录?,ruby-on-rails,ruby,activerecord,Ruby On Rails,Ruby,Activerecord,我有@invoices,其中包含与特定计划课程相关的所有发票 scheduled_course has_many :invoices, through => :enrollments invoices belongs_to :scheduled_courses @scheduled_course = ScheduledCourse.find(params[:id]) @invoices = @scheduled_course.invoices 现在,有些发票可能是重复的。例如,@inv

我有@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">
=>,
#, 
#, 
#, 
#, #
如何从结果中删除重复的对象

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

只需使用
@scheduled\u course.invoices.uniq
也应该可以使用。

您可以将
:uniq
选项传递到以下位置:

has_many :invoices, :through => :enrollments, :uniq => true
以下是RoR文档对此选项的描述:

如果为true,则将从集合中忽略重复项。与:至结合使用非常有用

此外,为了避免重复数据首先进入数据库,您可以使用唯一的数据库索引,该索引可能如下所示:

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

您不能直接调用uniq吗?使用uniq会将查询转换为数组,这可能会对性能产生负面影响。请记住#uniq会将ActiveRecord关联转换为发票数组,这可能会对性能和获取元素所需的时间产生负面影响。是的,请改用
distinct
。Thi的解决方案在Rails 4.0中将不受欢迎,甚至可能在Rails 4.1中不存在,因此建议使用替代的lambda版本:has_many:invoices、>{get unique elements}、:through=>:enrollments