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
refractclass\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
中的属于:计费周期的?