Направляющие 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 {}'))

Действительно ли это возможно?

56
задан John Topley 17 March 2010 в 03:39
поделиться

2 ответа

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 будет вызываться для объекта self (независимо от класса). Использование двойных кавычек не сработает.

Надеюсь, это то, что вы ищете.

95
ответ дан 7 November 2019 в 06:24
поделиться

Есть другое решение. Однако это не будет областью действия по умолчанию.

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)

Я не уверен, что это изящно и что-то, что могло бы решить вашу проблему. Могут быть более эффективные способы сделать это.

8
ответ дан 7 November 2019 в 06:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: