Is there a way to specify a possible relationship between models?

My app allows users to register and login but it also allows anyone to add comments, regardless of whether they are registered or not.

I have a comment table and a user table and I’d like to store the name and home page url of the comment author.

If the user is registered, then the comment needs a foreign key back to the registered user. But if the comment was posted anonymously, then I need to record the author name and url directly in the comment table. My comments table ends up with both:

class CreateComments < ActiveRecord::Migration def self.up create_table :comments do |t| t.column :comment, :text t.column :article_id, :integer t.column :user_name, :string #only used if user_id is empty

  t.column :user_url,   :string #only used if user_id is empty
  t.column :user_id,    :integer #when populated, user_name and user_url are ignored
end

end

def self.down drop_table :comments

end end

Then in my code when I need to find the author of the comment, I check the comment’s user_id and either get the author from the user record (user.name) or from the comment directly (user_name).

My question: Does rails have any mechanism for automatically getting the data either from a foreign key or directly from the record? Such a mechanism would save me from checking the foreign key to determine where the data should come from. Or perhaps there is a better database design for this situation?

Cheers

My app allows users to register and login but it also allows anyone to add comments, regardless of whether they are registered or not.

I have a comment table and a user table and I'd like to store the name and home page url of the comment author.

If the user is registered, then the comment needs a foreign key back to the registered user. But if the comment was posted anonymously, then I need to record the author name and url directly in the comment table. My comments table ends up with both:

class CreateComments < ActiveRecord::Migration def self.up    create_table :comments do |t|      t.column :comment, :text      t.column :article_id, :integer      t.column :user_name, :string #only used if user_id is empty      t.column :user_url, :string #only used if user_id is empty      t.column :user_id, :integer #when populated, user_name and user_url are ignored    end end

def self.down    drop_table :comments end end

Then in my code when I need to find the author of the comment, I check the comment's user_id and either get the author from the user record (user.name) or from the comment directly (user_name).

My question: Does rails have any mechanism for automatically getting the data either from a foreign key or directly from the record? Such a mechanism would save me from checking the foreign key to determine where the data should come from. Or perhaps there is a better database design for this situation?

You could override Comments#user to do the check for you automatically. That might get you into trouble though for an unregistered users if you forget.

But that's probably the easiest way to "hide it" from yourself...

-philip