How do I validate using associated objects?

This doesn’t make any sense to me anymore. I have an Upload that
belongs_to a Comment. Within my Upload model I expect to be able to
access the associated comment with comment.foo. I can only seem to do
this AFTER validation. I’m assuming before_create takes place between
validation and updating the database, because when I try to access
comment.foo within the validate method, I get “You have a nil object
when you didn’t expect it! The error occured while evaluating
nil.board”.

Now I am using single table inheritance, but I cannot access comment
from the Upload model either. Strangely, I can access uploads from the
Comment model.

This is frustrating the hell out of me :frowning:

class Comment < ActiveRecord::Base
belongs_to :board
has_many :uploads
end

class Upload < ActiveRecord::Base
belongs_to :comment
end

class Image < Upload
before_create :create_image
before_create :create_thumbnail

def create_image
@image = Magick::ImageList.new.from_blob(@upload_blob)
self[:image_width] = @image.columns
self[:image_height] = @image.rows
end

def create_thumbnail
@thumbnail = Magick::ImageList.new.from_blob(@image[0].to_blob)

if comment.parent_id == nil
  x = comment.board.setting(:parent_thumbnail_at_width)
  y = comment.board.setting(:parent_thumbnail_at_height)
else
  x = comment.board.setting(:reply_thumbnail_at_width)
  y = comment.board.setting(:reply_thumbnail_at_height)
end

if @thumbnail.columns > x or @thumbnail.rows > y
  @thumbnail.change_geometry!("#{x}x#{y}") {|cols, rows, img| 

img.resize!(cols, rows)}
end
end

def validate_on_create
errors.add_to_base(comment.board.language(:error_toobig)) if
self[:image_width] > comment.board.setting(:maximum_image_width)
end
end

Okay here’s an alternate question. Since I can access comment from
before_create, can I perform some kind of pseudo-validation there? ie
is there any way to prevent the object from being saved from within the
model outside of real validation methods?