recursos rails formularios anidados ruby-on-rails ruby html-table multiple-columns

ruby on rails - rails - Crear una tabla dinámica: Atributos=Columnas, Atributos anidados=Filas



recursos anidados rails (1)

Filas y columnas, bebé. Filas y columnas.

Dentro de una mesa:

Cuando un usuario agrega un nuevo: nombre y: indicador, quiero que cree una nueva columna.

Cuando un usuario agrega una nueva: valor_de_resultado &: valor_de_data, quiero que cree una nueva fila.

Así es como se ve actualmente mi mesa:

Por mi vida no puedo entender por qué algo que parece tan elemental es tan difícil. No sé si se supone que debo crear las filas y columnas en la base de datos, el modelo, el ayudante o la vista de índice y / o si debería usar algún otro idioma o gema para ayudarme. Cualquier dirección sería muy apreciada porque una docena de búsquedas de Google no me ha ayudado.

¿Utilizo add_column en la base de datos o algo así?

class CreateQuantifieds < ActiveRecord::Migration def change create_table :quantifieds do |t| t.string :categories t.string :name t.string :metric t.timestamps null: false end end end

¿O agrego columnas a través del modelo?

class Quantified < ActiveRecord::Base belongs_to :user has_many :results #correct accepts_nested_attributes_for :results, :reject_if => :all_blank, :allow_destroy => true #correct scope :averaged, -> { where(categories: ''averaged'') } scope :instance, -> { where(categories: ''instance'') } CATEGORIES = [''averaged'', ''instance''] end class Result < ActiveRecord::Base belongs_to :user belongs_to :quantified end

¿O sigo jugando con la vista de índice? Probé todo tipo de etiquetas html y de ''s, pero nunca pude conseguir que el código se viera como arriba, por lo que creo que la respuesta puede ser más profunda.

<!-- Default bootstrap panel contents --> <div id="values" class="panel panel-default"> <div class="panel-heading"><h4><b>AVERAGE</b></h4></div> <table> <% @averaged_quantifieds.each do |averaged| %> <% if averaged.user == current_user %> <th><%= averaged.name %> (<%= averaged.metric %>)</th> <td><% averaged.results.each do |result| %> <tr><td><%= result.date_value.strftime("%m-%Y") %></td> <td><%= result.result_value %></td></tr> <% end %></td> <% end %> <% end %> </table> </div> <br> <br> <br> <br> <!-- Default bootstrap panel contents --> <div id="values" class="panel panel-default"> <div class="panel-heading"><h4><b>INSTANCE</b></h4></div> <table> <% @instance_quantifieds.each do |instance| %> <% if instance.user == current_user %> <th><%= instance.name %> (<%= instance.metric %>)</th> <td><% instance.results.each do |instance| %> <tr><td><%= result.date_value.strftime("%m-%Y") %></td> <td><%= result.result_value %></td></tr> <% end %></td> <% end %> <% end %> </table> </div> <div class="values-button"> <%= link_to new_quantified_path, class: ''btn'' do %> <b><span class="glyphicon glyphicon-plus"</span></b> <% end %> </div>


Creo que puede haber un malentendido acerca de cómo se debe usar la base de datos.

No creo que alguna vez quieras que las tablas de la base de datos sean dinámicas. En cambio, debe configurar dos tablas. Uno para el usuario y otro para las métricas. Entonces, un usuario puede agregar nuevas métricas.

# == Schema Information # Table name: users # id :integer Class User < ActiveRecord::Base has_many :metrics end # == Schema Information # Table name: metrics # id :integer # type :string # result :string # user_id :integer Class Metric < ActiveRecord::Base belongs_to :user end

De esta forma, puede crear tantos tipos de métricas como desee. Y puede determinar a quién pertenece la métrica mediante el campo: user_id.

Leer esto de la cabeza a los pies debería ayudar: http://guides.rubyonrails.org/association_basics.html