development

동적 조건이있는 Rails has_many

big-blog 2020. 12. 26. 16:30
반응형

동적 조건이있는 Rails has_many


내가 원하는 것은 다음과 같은 외래 키없이 동적 방식으로 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+ way (아래에 답변 한 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(클래스가 무엇이든) 객체에 대해 호출됩니다 . 큰 따옴표를 넣으면 작동하지 않습니다.

나는 이것이 당신이 찾고있는 것이기를 바랍니다.


Rails 4 + 길 :

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

또 다른 종류의 해결책이 있습니다. 그러나 이것은 기본 범위가 아닙니다.

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하면 새로 생성 된 객체가 자동으로 regra_fiscal부모 와 동일한 속성을 갖게된다는 것 입니다.

참조 URL : https://stackoverflow.com/questions/2462203/rails-has-many-with-dynamic-conditions

반응형