I'm pondering a way of representing a scenario without too much
fiddling with the database. I'm 90% happy with it, but have one
problem (where I probably just don't know the right AR approach to
use).

I have a "people" table, from which records are displayed depending on
whether they are new leads, exisiting customers, or just contacts
(maybe reps at stores). I'm keeping them in one DB table, but I don't
want to use STI, as a single person *might* be more than one "type".

Here's the reasoning:

A Person can be flagged as "new lead".
A Person can have Orders (which makes them a customer).
A NewLead can have Orders - for instance trial packs that their sales
person has sent them - which makes them a customer as well as a lead.
A Person record can exist, and be neither a Customer or NewLead (I'm
calling these guys "contacts" for now, but they might as easily be
Foos or Bars...)

I want to be able to access the records using named_scopes, as, of
course, I want to be able to chain other scopes - so named_scopes are
essential (so I can get all the NewLeads for a given sales person, or
all the Contacts with a given surname, etc)

So I've got this structure:

class Person < ActiveRecord::Base
  # ...Person stuff
end

class NewLead < Person
  default_scope :conditions => "people.new_lead = 1" # ... simple
condition to return only new leads
end

class Customer < Person
  default_scope :group => "people.id", :joins => :orders  # ...
returns me unique instances (thanks to the :group) of just those
people who have any order records
end

class Contact < Person
  #... my problem... what does my default scope need to be to return
me people *without* orders, and with the "new_lead" flag set to zero?
end

The logic for NewLead and Customer is working perfectly - if I have a
Person with id=123 who has no orders, but new_lead set to "1", calling
"NewLead.find(123)" gives me a valid NewLead record, but
"Customer.find(123)" gives me a "record not found error" - just what I
want to happen. Then if that person has an order placed for them, both
of the finds returns a valid record.

But how to return records with no Orders.... ? I'm thinking that I may
need something along the lines of:

  default_scope :conditions => "people.id not in (select distinct
people.id from people joins orders on orders.person_id = people.id)
and people.new_lead = 0"

But that seems ugly.

Any suggestions for neater ways?

-- 
You received this message because you are subscribed to the Google Groups "Ruby 
on Rails: Talk" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/rubyonrails-talk?hl=en.

Reply via email to