Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

One controller with multiple models? Am I doing this correctly?

My web app, up until this point, has been fairly straight forward. I have Users, Contacts, Appointments and a few other things to manage. All of these are easy - it's just one model per section so I just did a scaffold for each, then modified the scaffolded code to fit my need. Pretty easy...

Unfortunately I am having a problem on this next section because I want the 'Financials' section of my app to be more in depth than the other sections which I simply scaffolded. For example, when the user clicks the 'Contacts' link on the navigation bar, it just shows a list of contacts, pretty straight forward and is in line with the scaffold. However, when the user clicks the 'Financials' link on the navigation bar, I want to show the bank accounts on the left of the page and a few of the transactions on the right.

So the financials tab will basically work with data from two models: transactions and bank_accounts. I think I should make the models (transactions & bank_accounts) and then make a controller called Financials, then I can query the models from the Financials controller and display the pages in app/views/financials/

Am I correct in this app layout? I have never worked with more than the basics of scaffolding so I want to ensure I get this right!

Thank you!

like image 606
dingalingchickenwiing Avatar asked Jun 12 '10 13:06

dingalingchickenwiing


People also ask

Can one controller have multiple models?

In MVC we cannot pass multiple models from a controller to the single view.

Do you need a controller for every model?

Do I need a controller for each model? No, not necessarily. However, having one controller per RESTful resource is a convention for a reason, and you should carefully analyze why that convention isn't meeting your needs before doing something completely different.

What's the difference between model names and controller names?

Fundamentally, the model “knows stuff”. It holds, the business logic of a piece of data. On the other hand, the controller, “does stuff”.


1 Answers

If you are comfortable with scaffolding then i would suggest that you generate a scaffold for both

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

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

and financials script/generate scaffold financials ...

In your transactions model, add this:

class Transaction < ActiveRecord::Base
  belongs_to :financial
end

In your bank_account model, add this:

class Bank_account < ActiveRecord::Base
  belongs_to :financial
end

In your financial model, add this:

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

Now from your financials controller you can use something like this:

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

In your views you can view all the bank accounts belonging to a particular financial by just doing this:

<% @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 -%>

In your views you can view all the transactions belonging to a particular financial by adding something 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 -%>

Remember, while creating a new transaction/bankaccount use the id belonging to the particular financial. Hope this helps. Cheers! :)

like image 190
Shripad Krishna Avatar answered Sep 24 '22 01:09

Shripad Krishna