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