Pular para o conteúdo principal

Associations

No Nerdify, o bloco associations dentro do modelo serve para definir os relacionamentos entre diferentes entidades da aplicação. Esses relacionamentos seguem a convenção e sintaxe padrão do Rails e do Mongoid, permitindo uma transição suave para quem já está familiarizado com o ecossistema Ruby on Rails.


🔍 Por que usar associations

  • Permite mapear os relacionamentos entre os modelos
  • Garante que os dados sejam conectados corretamente no banco
  • Serve como base para campos do tipo select, checkbox, radio ou embeds
  • Ajuda o Nerdify a entender como popular, exibir e salvar dados complexos automaticamente

🧱 Sintaxe

A sintaxe segue os padrões do Mongoid, e aceita opções como:

associations do
belongs_to :company
has_many :customers
has_one :profile
has_and_belongs_to_many :roles
end

Você pode usar as mesmas opções aceitas pelas macros padrão, como inverse_of, class_name, optional, dependent, entre outras. Para referência completa: 👉 Guia de Associações do Rails


🧠 Integração com Campos (fields)

Ao declarar uma associação como belongs_to :company, o Nerdify automaticamente integra essa informação com campos que utilizem o tipo select, checkbox, radio.

📌 Essa integração é feita quando um field utiliza o mesmo nome do relacionamento, e define a opção collection: com o caminho da API que retorna as opções.

✅ Exemplo prático


associations do
belongs_to :company
end

fieldset :dados do
field :company, type: :select, collection: "/companies", label: :name
end

Neste exemplo:

  • O select será automaticamente preenchido com o nome da empresa
  • O campo company_id receberá o id da empresa selecionada
  • O Nerdify armazenará em cache o valor selecionado (label) como company_id_label, evitando consultas desnecessárias

⚠️ Quando usado multiple: true no field, o relacionamento correspondente deve ser has_and_belongs_to_many, permitindo múltiplos valores vinculados corretamente.

✅ Exemplo prático


associations do
has_and_belongs_to_many :companies
end

fieldset :dados do
field :companies, type: :select, collection: "/companies", label: :name, multiple: true
end

🧩 Integração com Embeds (include: true)

O Nerdify permite criar formulários embedados de modelos relacionados com base na associação. Isso acontece quando você:

  • Define um embed com o mesmo nome da associação
  • Usa include: true

✅ Exemplo prático


associations do
belongs_to :customer
end

fieldset :enderecos do
embed :customer, include: true
end

Neste exemplo:

  • O Nerdify irá carregar o modelo Customer e usá-lo como base para montar os campos do formulário embedado
  • O nome da associação (:customer) será usado para construir o parâmetro de envio como customer_attributes

✅ Quando se usa include: true, não é necessário configurar autosave, accepts_nested_attributes_for ou similares do Rails e Mongoid. Tudo é tratado automaticamente pelo bloco embed no Nerdify sem precisar detalhar isso na associação.

🔗 Veja mais sobre isso na seção específica sobre embeds.


📎 Consultando as associations

Você pode consultar todas as associations definidas em tempo de execução com:

Customer.nerdify.associations

Isso retorna um array de OpenStruct com todos os parâmetros da action:

action = Customer.nerdify.associations.first

puts association.association # => "customer"
puts association.association_model # => "Customer"
puts association.type # => "belongs_to"
puts association.options[:optional] # => true

As actions são o elo entre modelo, template, controlador e frontend — definindo comportamento, acesso e estrutura de forma automatizada e elegante no Nerdify. ✅


📌 Resumo

  • As associations seguem a convenção do Rails/Mongoid
  • Integram com campos para facilitar entrada e exibição de dados relacionados
  • Servem de base para formulários embedados com include: true
  • Otimizam queries com caching automático de labels em campos do tipo select, checkbox e radio.

Com o uso correto de associations, seu modelo se torna muito mais poderoso, expressivo e conectado — tanto com o banco de dados quanto com os componentes visuais do Nerdify. 🚀