Tenho dois modelos:
class Product
belongs_to :storage_box
end
class StorageBox
validates :key
presence: true,
uniqueness: { scope: %i[kind] }
validates :kind
presence: true
def code
"#{key}#{kind.to_s.rjust(4, '0')}"
end
end
Gostaria de poder definir a storage_box
relação com base no code
método:
Product.new(storage_box: '150001')
Como devo proceder para conseguir isso? Não tenho certeza se o Product
deve lidar com isso (parece que não é "rails" fazer isso lá) ou instruir o StorageBox
como encontrar a base no code
.
Há muitas maneiras de codificar
Product.new(storage_box: '150001')
. Por exemplo, você provavelmente poderia sobrescrever ostorage_box=
método para detectar uma entrada de string e gerar uma novaStorageBox
instância para substituir a string. Mas eu recomendo fortemente que você não faça isso!O problema com essa abordagem é que você está fazendo os métodos ActiveRecord padrão funcionarem de maneiras que não foram projetados para. Na minha experiência, isso sempre causa consequências inesperadas mais tarde. Também confundirá o próximo desenvolvedor que tocar no seu código.
Em vez disso, recomendo que você escreva um método de classe dedicado:
Sua chamada então se torna
Product.new_in_storage_box('15001')
Melhor ainda, eu sugeriria que você movesse o detalhamento do código da caixa de armazenamento para a classe da caixa de armazenamento. Então:
Dessa forma, sua intenção fica clara e o novo código não interfere na operação normal do
Product.new
método.