Here's a gist with a clearer example of the problem I discuss below.
http://gist.github.com/186348

I'm currently using dm 0.9.11 with mysql.

Say I have users and books, and those books can be public or private.
I then have a 'readers' table which maps what books people can read.

I then want to return a list of books for a user which are *either*
public or has the user as an allowed reader, eg:

class User
end

class Reader
  belongs_to :user
  belongs_to :book
end

class Book
  property :private, Boolean, :default => true
  has n, :readers

  def self.accessible_by(user)
    all(
      :links => [Book.relationships[:readers]],
      :conditions => ["(readers.user_id = ? OR books.private = ?)",
user.id, false]
    )
  end
end

>> Book.accessible_by(current_user)

This works fine for private books, but for ones which are public it
will return duplicate records due to joining on the readers table
(assuming the public book has a number of readers)

In mysql I could use distinct, eg something like:

SELECT DISTINCT books.*
FROM books
INNER JOIN readers ON readers.book_id = books.id
WHERE readers.user_id = 10 OR books.private = FALSE

But I can't see a way of doing that easily with datamapper.

Obviously I could turn this example into a manual query, but that
isn't possible (that I'm aware of) in the actual use-case because I'm
using this as part of larger queries/chains for example:

>> current_account.books.accessible_by(current_user).all(:name.like => "%foo%", 
>> :order => [:created_at.asc])

Is there a way of achieving this with datamapper, or does anyone have
any recommendations of how I could change the architecture to make
this easier?

Thanks in advance for any help.

-- 
Richard Livsey
Minutebase - Online Meeting Minutes
http://minutebase.com
http://livsey.org

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"DataMapper" 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/datamapper?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to