동적 조건이있는 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
'development' 카테고리의 다른 글
경고 C4003 및 오류 C2589 및 C2059 on : x = std :: numeric_limits (0) | 2020.12.26 |
---|---|
HashMap에서 검색된 값의 순서가 삽입 순서입니다. (0) | 2020.12.26 |
매우 간단한 연결 목록 만들기 (0) | 2020.12.26 |
Android View layout_width-프로그래밍 방식으로 변경하는 방법? (0) | 2020.12.26 |
Jade를 사용하여 변수에서 HTML 렌더링 (0) | 2020.12.26 |