tutorial rails mvc generate for existing examples ruby-on-rails ruby model-view-controller

ruby on rails - rails - Rieles: obtener datos de una tabla para cada iteración de un bucle



ruby on rails tutorial (5)

Tengo un bucle (para el elemento en @dataset) y quiero, en cada iteración, obtener datos diferentes de otra tabla y realizar algunas operaciones que se imprimirán en la vista. No puedo obtener estos datos del conjunto de datos utilizado en el ciclo.

¿Cómo puedo hacer esto de acuerdo con MVC? Puedo poner el código en el bucle, en la vista, pero creo que es horrible.

¿Debo usar un ayudante para hacer esto y llamar la función desde la vista?

Gracias de antemano,

- ARemesal


Es bastante difícil decir cuál es la mejor solución para su problema sin detalles sobre los datos y las relaciones entre sus modelos (tablas). La idea común es la siguiente: mantén tus puntos de vista estúpidos. Obtenga todos los datos necesarios para mostrar la vista dentro de la acción de su controlador. Haga todos los cambios y cálculos dentro de la misma acción. Entonces a la vista usa esta información.

Por cierto, si estás hablando de un problema N + 1, lee más sobre los parámetros ''incluir'' y ''unir'' a ActiveRecord.


Si yo fuera usted, crearía una clase separada que encapsule el conjunto de datos y contenga toda la lógica involucrada en el procesamiento de las entradas del conjunto de datos. Esta clase podría ser iterable (responder a cada uno). Luego pasaría una instancia de esta clase a la vista y usaría solo sus métodos allí.


Si tiene una tabla y desea obtener datos de otra tabla, por lo general, esto se da en la situación de una relación has_many . Por ejemplo, tenemos @people (modelo de Person ) y cada persona has_many direcciones (modelo de Address ). En esos casos, lo mejor que puede hacer es esto

# Controller @people = Person.find(:all, :include => :addresses) ... # View @people.each do |p| p.addresses.each do |address| ...

Si sus datos no son solo tablas de bases de datos normales (tal vez lo obtenga de un servicio web, etc.), entonces una buena cosa es construir todos los datos en el controlador antes de tiempo, luego pasarlos a la vista . Algo como esto

# Controller @people = Person.find(:all) @people.each do |p| # attach loaded data to the person object in controller p.addresses = Address.load_from_somewhere_by_name(p.name) ...

De esta forma, el código de vista se mantiene limpio, así:

# View @people.each do |p| p.addresses.each do |address| ...


Person(id, name, other fields...) Event(id, title, ...) Date(id, date, time, event_id, ...) Disponibility(id, percent, date_id, person_id, ...)

Por supuesto, todas las relaciones se definen en el Modelo.

Tengo una vista que muestra todas las fechas de un evento, es fácil. Pero quiero, para cada fecha, imprimir los datos de todas las personas que están disponibles para esa fecha. En mi opinión, olvidando el patrón de diseño de MVC, podría codificar algo como esto:

<% for date in @Dates available = Disponibility.find_by_date_id(date.id) for item in available guy = Person.find_by_id(item.person_id) %>

Fecha de renderizado y personas disponibles ...

Quiero evitar esto en la vista. Creo que la respuesta de Orion Edwards es la más cercana para lo que necesito, pero, en ese ejemplo, ¿la dirección es un campo vacío para la tabla Person? ¿O cómo puedo agregar un nuevo atributo a la clase Person?

Aunque, ¿me estoy perdiendo algún truco de SQL para hacer esto?


  • Mantenga toda la lógica en su elemento @dataset dentro de la acción del controlador
  • Utiliza métodos en tus modelos para la interacción con otros objetos modelo que necesitas
  • Debería dejar solo @dataset para su vista que puede procesar de forma parcial.

Tendría que explicar su situación para obtener más respuestas sobre eso. ¿Con qué tipo de operaciones y otros modelos necesita interactuar? Si publicas las asociaciones de tu modelo, estoy seguro de que podríamos distanciarte.

¡Buena suerte!