I found your post well written. I think posts that are more difficult
to respond to tend to languish. I couldn't think of a good Rails way to
do this other than the following. You could add your own find_titles
method to Entry like this:
def self.find_titles(user_id)
entries = find(:all,
:select => "distinct(title)",
:joins => "inner join entries_projects ON
entries.id=entries_projects.entry_id",
:conditions => [" project_id IN(SELECT project_id FROM
memberships WHERE user_id= ?)", user_id])
entries.map {|e| e.title}
end
end
And then you could call it like this:
Entry.find_titles(1)
It makes your code cleaner. Better yet, you could put this code in a
new instance method in User called "titles" and then just call
@user.titles although in the titles method you would want to say
Entry.find_titles(self.id).
Hi Paul,
many thanks for the feedback.
I am still trying to get a feel for the language and the framework.
In this case, the way 'find' is used looks a lot like sql broken down in
several pieces, so I wonder what is the advantage over using straight
find_by_sql.
I agree. IMO you gain nothing, but make the query a fair bit harder to read.
I don't think AR is meant to supplant SQL, the rails devs would be
crazy to believe they could, it's more about making the simple stuff
more convenient.
Meanwhile, preliminary testing shows that the following might just work,
although some more testing is needed.
Hmm.. If you can manage to get the entries loaded eagerly, and there
aren't too many duplicates, something like this approach may work ok..
Using AR may be more portable in some cases, but if db independence is
a _real_ requirement, and you're working on a serious app, you'll need
some way to look up db-specific sql anyway (and this particular query
looks fairly standard).
I am still trying to get a feel for the language and the framework.
In this case, the way 'find' is used looks a lot like sql broken down in
several pieces, so I wonder what is the advantage over using straight
find_by_sql.
One advantage would be that if you use ActiveRecord's with_scope
method (which facilitates many cool DB tricks), and your find is made
within its block, the scope will automatically be applied to it. I
don't think that this happens with find_by_sql, looking at the
with_scope code.
There might be other benefits.
Meanwhile, preliminary testing shows that the following might just work,
although some more testing is needed.
Putting together this rather obscure line of code was fun, even though I
still need to develop a *pragmatic* sense of whether it was the right
kind of effort in the first place.
If you know @current_user.projects won't return "a lot" of results,
then this is fine. If this line slows down your page though, you'll
know it's because you're making Ruby do too much of the database
server's work and moving back to the SQL solution will probably help.