On Nov 9, 2009, at 9:36 PM, christian wrote:
> When I try to use @user.id I get the following error
>
> "Called id for nil, which would mistakenly be 4 -- if you really
> wanted the id of nil, use object_id"
>
> Is there something else I would have to change in order for it to
> work without the object_id ?
>
The problem is that you're looking at @user before it is set. Code
that needs the instance should be in the hobo_show block rather than
ahead of it.
So your controller would look like
def account
# @user is nil here
hobo_show do
# do something with @user here
end
end
On the genre issue, if Genres aren't being regularly created, it's
better to keep them as an enum_string rather than cluttering things
with an extra association. Certainly, if you keep the Genre table, you
shouldn't *ever* specifically code a value for the id field - using
Genre.find_by_name('Prose') would be much more resilient to DB changes
and so on.
With the genre table, one way to write the query you're looking for is:
@prose = Genre.find_by_name('Prose').submissions.find(:all, :include
=> :comments, :conditions => ['comments.owner_id != ? OR comments.id
IS NULL', @user.id])
The "comments.id IS NULL" part is SQL's weird way of saying "there
isn't a record"; for instance, this will find all submissions with NO
comments:
@no_comments_at_all = Submission.find(:all, :include
=> :comments, :conditions => 'comments.id IS NULL')
It looks really weird at first (since comments.id *can't* be null),
but is a result of the outer join that :include does; records in
'submissions' that don't have any associated records joined against an
'all null' row. comments.id in the above could actually be any field
that's guaranteed not to be null in real records, but the convention
is to use 'id' (since you've got other problems if you've got nil id
records...).
As a final note, I'd still recommend that you roll a chunk of this
logic into named scopes, thus:
class Submission
...
named_scope :not_commented_by, lambda { |u| { :include
=> :comments, :conditions => ['comments.owner_id != ? OR comments.id
IS NULL', u.id] } }
end
This cleans up the @prose find to:
@prose = Genre.find_by_name('Prose').submissions.not_commented_by(@user)
Good named scopes end up reading almost like a sentence; even a Ruby
novice would have a good chance of figuring out what the statement
above does.
Hope this helps!
--Matt Jones
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups "Hobo
Users" 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/hobousers?hl=en
-~----------~----~----~----~------~----~------~--~---