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属性。