Question

Having my db setup like this ("type" is always User although I have different kind of User via STI):

class User 
  # fields
  # :id
  # :sender_id, :sender_type
  # :recipient_id, :recipient_type
end

Postcard model:

class Postcard < ActiveRecord::Base
  belongs_to :owner, :class_name => User
  belongs_to :recipient, :class_name => User
end

I'd like to setup the User model something like this:

class User < ActiveRecord::Base
  has_many :postcards, :as => [:sender or :recipient] # this is not working
end

So I could say:

user.postcards

Is it possible?

PS: I've also tried this road:

  has_many :postcards, :finder_sql => Proc.new { "SELECT * FROM postcards WHERE postcards.owner_id=#{id} OR postcards.recipient_id=#{id}" }

But found myself stuck on scopes as :finder_sql recreates a whole new SQL:

  User.postcards.by_status('new').size
Was it helpful?

Solution

As mentioned by joelparkerhenderson I need to think differently my association strategy.

As I'd like to have:

user.postcards

My answer is simply to use scopes in Postcard model:

scope :of_user, lambda { |user| where("recipient_id = ? OR owner_id = ?", user.id, user.id) }

So I can invoke:

Postcard.of_user user

I could even wrap it in User model:

def postcards
   Postcard.of_user self
end
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top