Simplify code on method about 4 models

I’m trying to get more into the Ruby mindset. I know I should accomplish
more with less code. I came up with this method that does work, but I
think could really use some simplification.

There is 4 models.
Account
Company (belongs to Account)
User
(belongs to Company)
(belongs to Role)
(to get the account id, I would need to do user.company.account_id)
Role

User.role_id (if it’s a 1, it means it’s the Account Owner)
There is only ONE account owner per account.

So, when a “customer”(role_id=4) signs in, under the Users tab, he’s
supposed to see two companies:

  1. the company he belongs to
  2. and the account owners company

So I need to come up with something like this:
@companies = Company.all(:conditions => [“id == ? or id == ?”,
current_user.company_id, account_owner_company_id])

  1. Coming up with the company he belongs to it’s easy:
    current_user.company_id

  2. Coming up with the account owner company id it’s more difficult and
    requires several queries. The method I have does the following:
    a) Finds the customer’s account_id
    b) Looks for ALL account owners in the database
    c) Tries to match the customer’s account_id to one of the account
    owners id’s
    d) Finally, returns the account owner’s company id


def account_owner_company_id
customer_account_id = current_user.company.account_id
account_owners = User.find_all_by_role_id(1)
account_owners.each do |ao|
if ao.company.account_id == customer_account_id
@this_one = ao.company_id
end
end
@this_one
end

You can easily see that if the database grows, looking for ALL account
owners in the database can take up a lot of resources. Can you suggest
an easier way to find the account owner company id when being logged in
as a customer?

On Aug 10, 7:54pm, “Leonel .[email protected] wrote:


You can easily see that if the database grows, looking for ALL account
owners in the database can take up a lot of resources. Can you suggest
an easier way to find the account owner company id when being logged in
as a customer?

Your data structure feels a little weird to me - Presumably accounts
have multiple companies. So does someone with role_id == 1 own all the
companies in the account that the company_id points to? It feels a
little lopsided to have this one privileged company. I think
personally I would give account an owner_id attribute.

Anyway, assuming that users will grow rapidly but that an account will
only ever have a manageable number of companies in it, something like

all_companies_in_account = current_user.company.account.companies
owner = User.find_by_role_id_and_company_id(1,
all_companies_in_account)

would find you the owner.

Fred

Thanks Fred!

The reason of this setup (might need some adjusting) is that an Account
has an attribute paying_method. So only the account_owner is the one
that pays.

The account owner can add, edit or delete Companies and Users. He’s the
administrator for that Account.

The Users under the account owner’s Company, are kinda like managers or
agents.

The Users under other than the account owner’s company are customers.


ACCOUNT OWNER AND AGENTS


So let’s say Tom is the account owner.
His company is Landscaping Solutions.
He pays the app.

Users under his company (agents) can open, modify and close tickets.
Tom (user, role: account owner)
Rick (user, role: agent)
Pam (user, role:agent)


CUSTOMERS


So Tom invites other creates companies and invites users.
Customers can only open tickets.

Goliath National Bank (company)
Barney (user, role: customer)
Marshall (user, role: customer)

Mobious Designs (company)
Ted (user, role: customer)

Sorry, typo. Should be:

Account
  has_many :users, :through => :memberships

User
  has_many :accounts, :through => :memberships

Membership
  belongs_to :user
  belongs_to :account
  has_one :role # agent, owner, etc.


John F.
Principal Consultant, BitsBuilder
LI: http://www.linkedin.com/in/johnxf
SO: User John Feminella - Stack Overflow

I think you can dispense with Company altogether and just have an
association class describing a User’s relationship to an Account:

Account
  has_many :users, :through => :memberships

User
  belongs_to :account

Membership
  belongs_to :user
  belongs_to :account
  has_one :role # agent, owner, etc.

~ jf

John F.
Principal Consultant, BitsBuilder
LI: http://www.linkedin.com/in/johnxf
SO: User John Feminella - Stack Overflow