Block syntax for AR create and update

Hi all,

I just wanted some feedback on a AR hack I have been playing with which implements the block syntax for create and update method.

For example, instead of:

@person = Person.new(params[:person]) @person.has_rails_patch = false @person.set_status :uncool @person.save

You could do:

@person = Person.create(params[:person]) do |p|   p.has_rails_patch = false   p.set_status(:uncool) end

And the update version

@person = Person.update(params[:id], params[:person]) do |p|   p.set_status(:cool) end

It makes it more Rubyish with the blocks, don't you think? The bang! versions could added easily enough, for create anyway.

Let me know what you think before I put a patch in.

Thanks, Adam.

I like it. Note that new takes a block, so you can already

  @person = Person.new(params[:person]) do |p|     p.has_rails_patch = false     p.set_status :halfway   end.save!

if you like.

Best, jeremy

[snip]

You could do:

@person = Person.create(params[:person]) do |p| p.has_rails_patch = false p.set_status(:uncool) end

I like this a lot. I always thought create should work that way.

K

Sounds like it should be! Go for the patch!

regards, Jan

Thanks all. I will patch and let you know the link for the +1's!

Adam

Actually there is another thing I wanted canvas.

With create and update you have the option to pass in an array to save multiple records. Using the block syntax you could call the block on each record in the array.

Person.create([{:name => 'Adam'}, {:name => 'Jeremy'}]) do |p|   p.set_status(:cool) end

It could be powerful but is it intuitive or should they be mutually exclusive?

Adam.

Person.create([{:name => 'Adam'}, {:name => 'Jeremy'}]) do |p|

  p.set_status(:cool) end

['Adam', 'Jeremy'].each do |name|   Person.create do |p|     p.name = name     p.set_status(:cool)   end end

is not that different, and just uses a common ruby idiom

Cheers, Ian

Effectively the same, but because the array variants of create and update already exist it is a matter whether to pass the block to each record in the array. It doesn't have to but I was wondering if it would cause confusion. But on thinking it through I think it makes sense to me.

Adam

Patch is in. Please check it out and see if you like enough some +1's.

http://rails.lighthouseapp.com/projects/8994-ruby-on-rails/tickets/39-add-blocks-to-ar-create-and-update

It will add this goodness:

people = [{:name => 'Jeremy'}, {:name => 'Ken'}, {:name => 'Jan'}, {:name => 'Ian'}] Person.create(people) do |p|   p.set_status :cool   p.thanked = true end

Cheers, Adam