Truque simples para trabalhar com coluna dinâmica ActiveRecord e acessador encapsulado

Apenas escrevendo isso para que eu possa lembrar se eu precisar dele novamente, estou no meio da criação de um módulo de modelagem de domínio flexível genérico (eu o chamo de flexi-model).

Em resumo, o flexi-model é uma ferramenta de modelagem menos flexível do esquema. Ele pode armazenar seus dados de qualquer tipo de truque, fornecendo apenas um método de valor genérico e pegar o tipo de coluna correto da definição de coluna predefinida da classe de modelo.

Apenas para facilitar a compreensão, aqui está um código de amostra –

class Product
include
FlexiModel

flexi_field
:name, :string
flexi_field
:price, :decimal

set_flexi_partition_id USER
.store.id
end

Tenho a seguinte estrutura em –

[Coleção – para esquema dinâmico] – <[Registro] – <[Valor]

No formulário estou usando f.datetime_select: value onde ( f denota fields_for da instância Value) depois que o envio rails estava tentando descobrir o que é : coluna de valor na definição da tabela. uma vez que não é uma coluna existente, o rails estava gerando um erro MultiparameterAssignmentErrors .

Logo depois de cavar um pouco mais, parece que o valor de leitura from_parameters é responsável por carregar a definição de coluna real. Então, para simular, eu adicionei o seguinte código e ele funciona –

# Put it on your model instance
def column_for_attribute(name)
# Put your accessor name, in my case :value
if :value == name.to_sym
self.class.columns_hash[self.field.value_column.to_s]
else
self.class.columns_hash[name.to_s]
end
end

Isso é tudo 🙂

Copiado da postagem do meu blog – http://we4tech.wordpress.com/2012/06/20/simple-trick-to-work-with-activerecord-dynamic-column-and-encapsulated-accessor/