I have three tables: users, accounts, and transactions. Users have many accounts, accounts have many transactions. So I define my models like so:
class User < ActiveRecord::Base
has_many :accounts, dependent: :destroy
end
class Account < ActiveRecord::Base
belongs_to :user
has_many :transactions, dependent: :destroy
end
class Transaction < ActiveRecord::Base
belongs_to :account
end
Ideally on my app. When the current_user (btw, I’m also using Devise clicks shows accounts, then clicks an account to show transactions for that page - eventually I end up on /transactions?account=2 URL. Until here works fine.
In my transactions controller, however, I was to display on that page transactions for that user (current_user) for that account (id=2). I’m not sure the correct way to do this thought. Below is what I was trying:
def index
@account = current_user.accounts.find_by_id(params[:accoount])
@transactions = @account.transactions.find_all_by_account(params[:accoount]);
end
Aaargh!!! I see it, I didn’t type “account” correctly. I thought I was using the method incorrectly. How did I not see that for so long?!
@account = Users.accounts.find_by_id(params[:accoount])
This now works - @account = current_user.accounts.find_by_id(params[:account])
@account = Account.find(params[:account])
should also work. A possible disadvantage of this method (depending
on your application) is that a manually constructed url could show an
account that does not belong to the current_user.
Consider, though, that if for whatever reason an invalid id is passed
in, @account will be nil and so @account.transactions will give you
a NoMethod error.
If a user attempts to request an account that doesn’t belong to them, this will raise ActiveRecord::RecordNotFound. The default Rails rescue_from will translate that into an HTTP 404 Not Found response.