Forum: Rails-core (closed, excessive spam) Block syntax for AR create and update

21126416f8a3de608f82069ab943a336?d=identicon&s=25 Adam Meehan (Guest)
on 2008-04-22 08:18
(Received via mailing list)
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.
24d2f8804e6bb4b7ea6bd11e0a586470?d=identicon&s=25 Jeremy Kemper (Guest)
on 2008-04-22 08:29
(Received via mailing list)
On Mon, Apr 21, 2008 at 11:18 PM, Adam Meehan <adam.meehan@gmail.com>
wrote:
>  You could do:
>  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.

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
Baa2742c865e9fe9fe51ecc095c539fb?d=identicon&s=25 Ken Miller (Guest)
on 2008-04-22 19:13
(Received via mailing list)
On Apr 21, 11:18 pm, Adam Meehan <adam.mee...@gmail.com> wrote:

[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
D88959b256e5d7d3df3b7bd3a77fe931?d=identicon&s=25 Jan De Poorter (Guest)
on 2008-04-22 19:39
(Received via mailing list)
Sounds like it should be! Go for the patch!

regards,
Jan
21126416f8a3de608f82069ab943a336?d=identicon&s=25 Adam Meehan (Guest)
on 2008-04-22 21:55
(Received via mailing list)
Thanks all. I will patch and let you know the link for the +1's!

Adam
21126416f8a3de608f82069ab943a336?d=identicon&s=25 Adam Meehan (Guest)
on 2008-04-22 23:00
(Received via mailing list)
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.
C45aa3228424f6a35ebbfcd7a0e9d801?d=identicon&s=25 Ian White (Guest)
on 2008-04-22 23:40
(Received via mailing list)
>  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
21126416f8a3de608f82069ab943a336?d=identicon&s=25 Adam Meehan (Guest)
on 2008-04-22 23:48
(Received via mailing list)
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
21126416f8a3de608f82069ab943a336?d=identicon&s=25 Adam Meehan (Guest)
on 2008-04-23 00:33
(Received via mailing list)
Patch is in. Please check it out and see if you like enough some +1's.

http://rails.lighthouseapp.com/projects/8994-ruby-...

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
This topic is locked and can not be replied to.