Estoy actualizando una aplicación Rails 3 a rails 5.1. En el modelo Rails-3 tengo una condición como

has_one :current_contract, :class_name => 'Contract', :conditions => Proc.new { "contract_vw.country = '#{country_id}'" if country_id }

Supongo que la desarrolladora anterior sigue este truco

https://makandracards.com/makandra/983-dynamic-conditions-for-belongs_to-has_many-and-has_one-associations

No estoy segura de cómo convertirlo a Rails 5.1

Cualquier ayuda apreciada.

0
learner2017 21 feb. 2018 a las 07:14

2 respuestas

La mejor respuesta

La forma de Rails 4+ es escribir el alcance así:

has_one :account, -> (country_id) { where('contract_vw.country = ?', country_id) }, class_name: 'Contract'

Sin embargo, has escrito if country_id en la asociación, lo que me parece realmente extraño. Aunque where('contract_vw.country = ?', country_id) if country_id podría funcionar, probablemente lo extraería en un método como:

def country?
  country_id.present?
end

Y luego, donde lo necesite:

@model.account if @model.country?
1
okay56k 21 feb. 2018 a las 04:56

Si entiendo correctamente su caso de uso, no está obligado a usar has_one y, en este caso, creo que no debería usarse, use un método regular en su lugar.

def current_contract
  contracts.where("contract_vw.country = ?", country_id).first if country_id.present?
  # or ...
  contracts.find_by(country: country_id)
end
0
Eyeslandic 21 feb. 2018 a las 09:24