Rails has_manydynamic条件
我想要的是创build一个模型,以dynamic的方式使用has_many关联与另一个连接,不需要像这样的外键:
has_many :faixas_aliquotas, :class_name => 'Fiscal::FaixaAliquota', :conditions => ["regra_fiscal = ?", ( lambda { return self.regra_fiscal } ) ]
但是我得到的错误:
: SELECT * FROM "fis_faixa_aliquota" WHERE ("fis_faixa_aliquota".situacao_fiscal_id = 1 AND (regra_fiscal = E'--- !ruby/object:Proc {}'))
这可能吗?
Rails 4+方式(感谢托马斯谁回答下面):
has_many :faixas_aliquotas, -> (object) { where("regra_fiscal = ?", object.regra_fiscal) }, :class_name => 'Fiscal::FaixaAliquota'
Rails 3.1+方式:
has_many :faixas_aliquotas, :class_name => 'Fiscal::FaixaAliquota', :conditions => proc { "regra_fiscal = #{self.regra_fiscal}" }
Rails 3及以下版本:
has_many :faixas_aliquotas, :class_name => 'Fiscal::FaixaAliquota', :conditions => ['regra_fiscal = #{self.regra_fiscal}']
不,这不是一个错误。 条件以单引号指定,并且仍包含代码#{self.regra_fiscal}
。 当条件条款被消除时,regra_fiscal方法将在自己的对象(无论类是什么)上被调用。 放双引号是行不通的。
我希望这是你正在寻找的。
Rails 4 +方式:
has_many :faixas_aliquotas, -> (object){ where("regra_fiscal = ?", object.regra_fiscal)}, :class_name => 'Fiscal::FaixaAliquota'
还有另一种解决scheme。 但是,这不会是默认范围。
has_many :faixas_aliquotas, :class_name => 'Fiscal::FaixaAliquota' do def filter(situacao_fiscal) find(:all, :conditions => {:regra_fiscal => situacao_fiscal.regra_fiscal}) end end
这样你就可以做到
situacao_fiscal.faixas_aliquotas.filter(situacao_fiscal)
我不确定这是否优雅,可以解决您的问题。 可能有更好的方法来做到这一点。
Rails 4+另一种方式:
has_many :faixas_aliquotas, -> (object){ where(regra_fiscal: object.regra_fiscal) }, :class_name => 'Fiscal::FaixaAliquota'
在Rails 3.1中需要使用proc,Proc.new {“field =#{self.send(:other_field)}”}
在Rails 3.1中,你可以使用Proc.new来处理你的条件。 正如@Amala所说的,而是像这样产生一个哈希值:
has_many :faixas_aliquotas, :class_name => 'Fiscal::FaixaAliquota', :conditions => {:regra_fiscal => Proc.new { {:regra_fiscal => self.regra_fiscal} }
这种方法的好处是,如果你执行object.faixas_aliquotas.build
,新创build的对象将自动具有与父对象相同的regra_fiscal
属性。