2010-06-12 8 views
5

Mi aplicación web, hasta este momento, ha sido bastante sencilla. Tengo usuarios, contactos, citas y algunas otras cosas para administrar. Todo esto es fácil, es solo un modelo por sección, así que hice un andamio para cada uno, luego modifiqué el código de scaffolded para adaptarlo a mis necesidades. Bastante fácil ...¿Un controlador con múltiples modelos? ¿Estoy haciendo esto correctamente?

Desafortunadamente, estoy teniendo un problema en la siguiente sección porque quiero que la sección 'Finanzas' de mi aplicación sea más detallada que las otras secciones que simplemente andamé. Por ejemplo, cuando el usuario hace clic en el enlace "Contactos" en la barra de navegación, solo muestra una lista de contactos, bastante directa y en línea con el andamio. Sin embargo, cuando el usuario hace clic en el enlace 'Finanzas' en la barra de navegación, quiero mostrar las cuentas bancarias a la izquierda de la página y algunas de las transacciones a la derecha.

Por lo tanto, la pestaña de finanzas básicamente funcionará con los datos de dos modelos: transacciones y cuentas bancarias. Me que que debería hacer los modelos (transacciones & bank_accounts) y luego hacer un controlador llamado Finanzas, entonces puedo consultar los modelos de controlador de Finanzas y mostrar las páginas en app/views/finanzas/

Estoy en lo correcto en este diseño de la aplicación? ¡Nunca he trabajado con más que los fundamentos del andamio, así que quiero asegurarme de que lo entiendo!

¡Gracias!

Respuesta

4

Si se siente cómodo con andamios entonces sugeriría que se genera un andamio para ambas operaciones

: script/generate scaffold transaction financial_id:integer ...

bank_accounts: script/generate scaffold bank_account financial_id:integer ...

y finanzas script/generate scaffold financials ...

En su modelo de transacciones , agregue esto:

class Transaction < ActiveRecord::Base 
    belongs_to :financial 
end 

En su modelo BANK_ACCOUNT, añadir lo siguiente:

class Bank_account < ActiveRecord::Base 
    belongs_to :financial 
end 

En su modelo financiero, añadir lo siguiente:

class Financial < ActiveRecord::Base 
    has_many :transactions 
    has_many :bank_accounts 
end 

Ahora, desde su situación financiera Controller se puede usar algo como esto:

def index 
    @financial = Financial.find(params[:id]) 

    #This fetches all bank_accounts related to financial 
    @bank_accounts = @financial.bank_accounts 

    #This fetches all transactions related to financial 
    @transactions = @financial.transactions 
end 

En sus puntos de vista puede ver todas las cuentas bancarias que pertenecen a una financiera en particular con solo hacer esto:

<% @bank_accounts.each do |bank_account| -%> 
    <%=h bank_account.something_here %> <!-- something_here is the column name corresponding to your bank_account table. --> 
    <%=h bank_account.something_here %> <!-- something_here is the column name corresponding to your bank_account table. --> 
    <%=h bank_account.something_here %> <!-- something_here is the column name corresponding to your bank_account table. --> 
    . 
    . 
    . 
<% end -%> 

En sus puntos de vista se pueden ver todas las transacciones que pertenecen a una financiera en particular mediante la adición de algo similar:

<% @transactions.each do |transaction| -%> 
    <%=h transaction.something_here %> <!-- something_here is the column name corresponding to your bank_account table. --> 
    <%=h transaction.something_here %> <!-- something_here is the column name corresponding to your bank_account table. --> 
    <%=h transaction.something_here %> <!-- something_here is the column name corresponding to your bank_account table. --> 
    . 
    . 
    . 
<% end -%> 

Recuerde, mientras que la creación de una nueva transacción/bankaccount utilizar el ID de pertenencia a lo particular financiera . Espero que esto ayude. ¡Aclamaciones! :)

+1

No estoy seguro si esta es la mejor manera de implementar las relaciones para estos modelos. Presumiblemente, las cuentas y las transacciones tienen una relación uno a muchos. Forzarlos a ambos a ser hijos de un modelo con el propósito de crear un controlador y ver simplemente para mostrar la información de dos modelos relacionados en conjunto es más una solución que cualquier otra cosa. – Shaun

+0

Tienes razón. Pero solo intenté responder al problema inmediato que @ user363243 estaba enfrentando, teniendo en cuenta que algunos modelos X e Y están atados con un controlador Z. No presumí nada más ya que no se me preguntó explícitamente. :) –

+0

Hola chicos, gracias por la gran ayuda! El único problema con el ejemplo anterior es que "financieros" era solo una forma de agrupar cuentas bancarias y sus transacciones relacionadas. Podría haberlo llamado 'Centro bancario' o algo así. Dicho esto, no pude hacer algo como @financial = financial.find (params [: id]) – dingalingchickenwiing

0

No tengo una gran cantidad de experiencia con Ruby on Rails, o el trabajo de MVC en general, pero creo que lo estás haciendo bien. Por lo general, desea un objeto modelo (y, por extensión, una tabla de base de datos) para recursos orientados a datos ... Es decir, sus modelos deben corresponder a sus "nombres". Las acciones de tu controlador son tus "verbos", y para mí tiene mucho sentido categorizarlos como prefieras.

En este caso, diría que poner un montón de "verbos" bajo financials, que interactúan con dos tipos de objetos modelo según sea necesario, tiene sentido SI Y SÓLO si tiene sentido para usted organizarlo de esta manera . (Tenga en cuenta que también puede evaluar qué tan bien organizadas e intuitivas son las URL correspondientes, ¡aunque estoy seguro de que la mayoría de los puristas de MVC agregarían que nunca debería confiar únicamente en examinar las URL!)

Así que en resumen Creo que estás haciendo todo bien aquí, siempre y cuando tenga sentido para ti. Sí, tendrá que escribir sus vistas y acciones del controlador usted mismo, aunque puede comenzar a usar ruby script/generate controller financials action1 action2 [...]; que al menos le proporciona esqueletos de los archivos de vista y acciones de controlador vacías.

1

Me suena como si quieres dos puntos de vista:

Sin embargo, cuando el usuario hace clic en el enlace 'Finanzas' de la barra de navegación, quiero mostrar las cuentas bancarias de la parte izquierda la página y algunas de las transacciones a la derecha. las transacciones a la derecha.

Tenga en cuenta que una pantalla no siempre significa una vista en MVC. Conceptualmente, una vista simplemente procesa los datos del modelo para que el usuario pueda hacer algo significativo con él a través de acciones del controlador. Rails se complica un poco haciendo que crees un archivo en un directorio views/para cada pantalla, por lo que es fácil pensar que una pantalla significa una vista. Sin embargo, también puede llamar a diseños en vistas en Rails, y estos diseños son ellos mismos vistas.

Poner transacciones y cuentas en vistas separadas significa que cada una tendrá un controlador para manejar la interacción del usuario con cada segmento de datos. El controlador de cuenta, por ejemplo, manejaría el evento donde el usuario selecciona una cuenta para ver información adicional sobre una cuenta. Esto daría como resultado la búsqueda de transacciones para mostrar al usuario. El usuario podría interactuar con una transacción en un intento de conciliarla, anularla o impugnarla. Esto invocaría la lógica en el controlador de transacción.

Aunque esto hace un buen trabajo eliminando el acoplamiento de los controladores, puede parecer que acopla las dos vistas. Sin embargo, el acoplamiento es unidireccional: la lista de cuentas incluye lógica específica para la vista de transacción (es decir, actualizándola cuando selecciona una cuenta). La vista de transacción permanece reutilizable en otras áreas de la aplicación.En su mayor parte, el listado de la cuenta también se puede reutilizar, especialmente si lo aísla en un diseño diferente. La única diferencia que necesitaría para esta pantalla específica es el manejo de cuando un usuario hace clic en una cuenta.

Si combina todo en una vista financiera, aún es posible mantener las cosas juntas, pero se vuelve más difícil hacerlo. La capa adicional requiere un esfuerzo extra y puede guiarte subconscientemente para unir todo junto.

Por supuesto, de cualquier manera funciona, y se podría argumentar fácilmente que el diseño final es un ejercicio que es mejor dejarlo a las preferencias del desarrollador. Simplemente ofrezco mi interpretación de cómo uno se apegaría con mayor precisión a los patrones que Rails intenta guiar a los desarrolladores a usar.

+1

Me está costando entender esto, lo siento, pero soy bastante nuevo en los rieles. ¿Está sugiriendo que debería tener un controlador para cada modelo (cuentas bancarias y transacciones) y hacer referencia a esos controladores del controlador financiero que haré? Si eso no es lo que quieres decir, no entiendo. :( – dingalingchickenwiing

+1

Tendría dos modelos y dos controladores: uno de cada uno para transacciones bancarias y transacciones. Cada controlador administraría acciones asociadas con vistas e interactuaría con el modelo. Tendría muchos modelos dependiendo de cómo su usuario necesitaba verlos o interactúa con los datos. En el ejemplo que das, tu página "Finanzas" tiene dos vistas, una cuenta bancaria en el lado que permite al usuario hacer clic y seleccionar una cuenta, y una lista de transacciones en el panel principal que mostró transacciones relevantes. – Shaun

+0

bien, cuando dices "En el ejemplo que das, tu página de" Finanzas "tendría dos vistas una: una cuenta bancaria que incluye el lado que permite al usuario hacer clic y seleccionar una cuenta, y una lista de transacciones en el panel principal que mostró las transacciones relevantes. "¿Quiere decir parciales cuando dice puntos de vista? Pregunto esto porque podría cargar un parcial de otro directorio (es decir app/views/bank_accounts/_accounts.html.erb y app/views/transactions/_transaction_list.html.erb) – dingalingchickenwiing

Cuestiones relacionadas