Hi Peter,

One way, via two queries would be something like:

  # in app/models/user.rb:
  def not_yet_listened_recordings
    ls = Listening.find_by_sql(["select distinct recording_id from
listenings where user_id=?, self.id])
    return Recording.find(:all) if not ls or ls.empty?

    criteria_a = []
    vals_a = []
    ls.each do |l|
      criteria_a << "id<>?"
      vals_a << l.recording_id.to_i
    end
    qstr = "select * from recordings where #{criteria_a.join(' and
')}"
    sql_a = [qstr] + vals_a
    return Recording.find_by_sql(sql_a)
  end

  ...

which you would then be able to call like:

  ...
  user.not_yet_listened_recordings
  ...

Jeff

On Feb 16, 7:10 am, Peter Browne <[email protected]> wrote:
> I have 3 models with a has_many through association:
>
> class Recording
>   has_many :listenings
>   has_many :listeners, :through => :listenings, :source => :user
>   ...
> end
>
> class User
>   has_many :listenings, :foreign_key => "listener_id"
>   has_many :listened_recordings, :foreign_key =>
> "listener_id", :through => :listenings, :source => :recording
>   ...
> end
>
> class Listening
>   belongs_to :recording
>   belongs_to :listener, :class_name => "User"
>   ...
> end
>
> So I can get the recordings the user has listened to, easily with:
>
> user.listened_recordings
>
> How do create a find method that retrieves all of the recordings the
> user has not listened to?
> The way I have been doing it is:
>
> Recording.all.reject { |r| listened_recordings.include?(r) }
--~--~---------~--~----~------------~-------~--~----~
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