Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/67.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 Rails 4动态重新查看或重新筛选子对象_Ruby On Rails_Ruby_Activerecord - Fatal编程技术网

Ruby on rails Rails 4动态重新查看或重新筛选子对象

Ruby on rails Rails 4动态重新查看或重新筛选子对象,ruby-on-rails,ruby,activerecord,Ruby On Rails,Ruby,Activerecord,有一个计费周期: class BillingCycle has_many :billing_data, class_name: BillingData has_many :billing_data_lines, through: :billing_data end class BillingData has_many :billing_data_lines end 这是BillingDataLine的: class BillingDataLine belongs_t

有一个
计费周期

class BillingCycle
    has_many :billing_data, class_name: BillingData
    has_many :billing_data_lines, through: :billing_data
end

class BillingData
  has_many :billing_data_lines
end
这是BillingDataLine的

class BillingDataLine 
  belongs_to :billing_data
end
代码中有一个地方,我们只需重新查看或更新子记录列表,如下所示:

@cycle.billing_data_lines = @cycle.billing_data_lines.where(info_number: @restricted_numbers)
但这显然是行不通的,它指出了这个错误:

Cannot modify association 'BillingCycle#billing_data_lines' because the source reflection class 'BillingDataLine' is associated to 'BillingData' via :has_many.

也许我试图以错误的方式处理这种情况,但如果您可以动态地重新筛选/重新定义子对象记录的范围,那就太好了。有什么方法可以完成所需的吗?

在您的类中
BillingCycle
refract
class\u name
参数到字符串:

class BillingCycle
  has_many :billing_data, class_name: "BillingData"
或者干脆把它去掉,因为它没有意义,因为你的名字是一样的

class BillingCycle
  has_many :billing_data

你想完成什么?通过将周期的BillingDataLines设置为其先前BillingDataLines的子集,您将只获得删除部分BillingDataLines的结果。您可以通过取消查询、直接在账单数据行上运行查询并删除其中的父关系来获得相同的效果:

BillingDataLine.
  where(billing_data: {billing_cycle_id: @cycle.id}).
  where.not(info_number: @restricted_numbers).
  update_all(billing_data_id: nil)

解决方案是创建别名方法,并在有限制号码时覆盖记录:

   alias_method :_billing_data_lines, :billing_data_lines
    def billing_data_lines
        @_restricted_numbers ? _billing_data_lines.where(info_number: @_restricted_numbers) : _billing_data_lines
    end

    def restrict_by_number(numbers)
        @_restricted_numbers = numbers
    end
这就是它的名字:

@cycle.restrict_by_number(restricted_numbers)

这没什么变化。您是否错过了
BillingData
中的
属于:计费周期的