Find first or create

Is there any ActiveRecord's dynamic finder that can allow me to find
first association or create it if it doesn't exist. Something like this
(not this code is conceptual - it does not work!):

Comment.posts.find_or_create(:first)

Milan Dobrota wrote:

Is there any ActiveRecord's dynamic finder that can allow me to find
first association or create it if it doesn't exist. Something like this
(not this code is conceptual - it does not work!):

Comment.posts.find_or_create(:first)

I meant:

Post.comments.find_or_create(:first) lol

Well, this is strictly off the top of my head, but could you:

@post = Post.find(...somehow...)

Comment.find_or_create_by_post_id(:post_id => @post.id)

If that doesn't do what you want, post more code that shows what you want and what you've tries that is giving you a different result.

-Rob

Rob Biedenharn http://agileconsultingllc.com
Rob@AgileConsultingLLC.com

If it doesn't find a comment, and creates a new one, what values is it
going to populate the record with?
Or is it that you want a new blank record for some purpose?

Either that or perhaps to be able to use the find_or_initialize
counterpart.

In this case I have before create hooks in place to fill in some
attributes.

If you trim the whole of the email you're replying too, we lose all
sense of context....

Anyway... a simple solution is to have a method add a new comment if
the comments array is empty, and then send the call that you pass to
the array (so you can use any Array method as a parameter). More
complex solutions would be to patch AR::Base or maybe Array to do a
similar thing.

# in your Post model
def find_or_create_comment(which)
  Post.comments << Comment.create if Post.comments.blank?
  Post.comments.send(which.to_s) if Post.comments.respond_to?(which.to_s)
end

That's off the top of my head so it is probably buggy, but might put
you on the tail of something that suits - it relies on the "create"
method actually working, so if the Comment fails validation, it will
break big time.

I think better solutions might be suggested if you describe the
problem that you have that you want to use this as a solution to...

Regards,