为了账号安全,请及时绑定邮箱和手机立即绑定

Rails has_many具有动态条件

/ 猿问

Rails has_many具有动态条件

SMILET 2019-11-14 10:52:19

我想要的是创建一个模型,该模型使用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 {}'))

这可能吗?



查看完整描述

3 回答

?
繁花如伊

Rails 4+方式(感谢Thomas在下面回答了此问题):

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方法将在的对象上调用self(无论该类是什么)。用双引号将不起作用。


我希望这是您要寻找的。


查看完整回答
反对 回复 2019-11-14
?
沧海一幻觉

Rails 4 +方式:


has_many :faixas_aliquotas, -> (object){ where("regra_fiscal = ?", object.regra_fiscal)},  :class_name => 'Fiscal::FaixaAliquota'


查看完整回答
反对 回复 2019-11-14
?
Qyouu

还有另一种解决方案。但是,这将不是默认范围。


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)

我不确定这是否优雅,是否可以解决您的问题。可能有更好的方法可以做到这一点。


查看完整回答
反对 回复 2019-11-14
  • 3 回答
  • 0 关注
  • 61 浏览
我要回答
慕课专栏
更多

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信