Hi there,
this is my first post here and I'm pretty new to Rails, too. So be
kind, please.
I'm building a role-based system and I want some of the roles to have their own model/class. So I decided for a STI scenario where I have User model, then Salesman and BillingClerk models which are derived from the first one. Then, when I instantiate the current user after the authentification I create either an instance of the Salesman or the BillingClerk class. I'd like to have it like this because I want to define associations for each of these models separately - because although salesmen and billing clerks relate to the same entity (eg. an ad), they relate to it in a different way (salesman has many ads through ad assignments and billing clerk has many ads through all of his salesmen). I tried two approaches, but none of them worked as I wanted:
Here is my first try:
class User < ActiveRecord::Base   ... end
class Salesman < User   has_many :ad_assignments   has_many :ads, :through => :ad_assignments   belongs_to :billing_clerk   ... end
class BillingClerk < User   has_many :salesmen   has_many :ads, :through => :salesmen, :source => :billing_clerk   ... end
This approach didn't work at all:
Mysql::Error: Not unique table/alias: 'users': SELECT users.* FROM users INNER JOIN users ON users.id = users.billing_clerk_id WHERE (users.deleted_at IS NULL OR users.deleted_at > '2008-04-27 21:11:05') AND ((users.billing_clerk_id = 4) AND ((users.type = 'Salesman'))) AND ( (users.`type` = 'BillingClerk' ) )
With my second try (although not that clean as the first one) I had more luck. After I found out that rails doesn't know how to handle multiple :through associations on the same table (or am I wrong at this?), I decided to tell it how to handle ads association in the BillingClerk model, so it now looks like this:
class BillingClerk < User   has_many :salesmen   has_many :ads, :class_name => 'Ad',           :finder_sql => 'SELECT ads.* FROM ads                           LEFT JOIN ad_assignments ON ads.ad_assignment_id = ad_assignments.id                           LEFT JOIN users salesmen ON ad_assignments.user_id = salesmen.id                           WHERE salesmen.billing_clerk_id = #{id}'
  ... end
This approach works. Kind of. I can get an array of Ad objects when i call BillingClerk.find(:first).ads. That's fine. But when i try to get some subset of ads through find method, eg. BillingClerk.find(:first).ads.find :first, I get just nil. How is that possible? I just don't understand it. Can someone help?
I'm using Rails 1.8.6.
Thank you in advance, Milan