Forum: Ruby on Rails Cannot pass id field to ActiveRecord

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
Af3cecc8af253b5acd3c09c5b67c0074?d=identicon&s=25 Valentino Lun (on9west)
on 2009-02-24 15:00
Dear all

I have a dummy question. The model code as follow:

class User < ActiveRecord::Base
  set_primary_key "username"
end


In script/console

user = {:username => "123", :display_name => "345"}
=> {:username=>"123", :display_name=>"345"}

a = User.new(user)
=> #<User username: nil, display_name: "345">

Why the username field is nil instead of "123"? I also tried
{:id=>"123", :display_name=>"345"}, still not work

But there is no problem when I do the following
a.username = "123" or a.id = "123"
a.save

Please help. Thank you very much.

Valentino
81b61875e41eaa58887543635d556fca?d=identicon&s=25 Frederick Cheung (Guest)
on 2009-02-24 15:03
(Received via mailing list)
On 24 Feb 2009, at 14:00, Valentino Lun wrote:
> But there is no problem when I do the following
> a.username = "123" or a.id = "123"
> a.save
>
> Please help. Thank you very much.
>
Because the primary key is protected from mass assignment.

Fred
Af3cecc8af253b5acd3c09c5b67c0074?d=identicon&s=25 Valentino Lun (on9west)
on 2009-02-24 15:13
Frederick Cheung wrote:
> On 24 Feb 2009, at 14:00, Valentino Lun wrote:
>> But there is no problem when I do the following
>> a.username = "123" or a.id = "123"
>> a.save
>>
>> Please help. Thank you very much.
>>
> Because the primary key is protected from mass assignment.
>
> Fred

Thank you for your reply

Is that the only way to insert record like this?
a = User.new
a.username = "123"
a.display_name = "456"
a.save
The code is not elegant then.

In this situation, It is not allowed to use the scaffold code in
controller like this? It is not convenient if the primary key is not the
default "id" field.
@user = User.new(params[:user])

Thanks
Valentino
80e4cb97cae5c8d745f72337d93fd8f2?d=identicon&s=25 MaD (Guest)
on 2009-02-24 15:26
(Received via mailing list)
you just have to set the primary key manually.
  @user = User.new(params[:user])
  @user.username = params[:username]
  @user.save

however for security reasons i would not advise to use mass-assignment
for user-creation anyways. there could be stuff like that in there:
  >> params[:user][:is_admin]
  => "1"
Ef3aa7f7e577ea8cd620462724ddf73b?d=identicon&s=25 Rob Biedenharn (Guest)
on 2009-02-24 15:34
(Received via mailing list)
On Feb 24, 2009, at 9:13 AM, Valentino Lun wrote:

>>
>
> In this situation, It is not allowed to use the scaffold code in
> controller like this? It is not convenient if the primary key is not
> the
> default "id" field.
> @user = User.new(params[:user])
>
> Thanks
> Valentino

No, you can do this:

a = User.new(:display_name => "456") do |u|
       u.id = 123
     end
a.save    # or use .create in the first place rather than .new

However, if you have 'username' as the primary key, I'd strongly
suggest that you reconsider that and follow the more conventional auto-
incrementing integer primary key.  Unless you have to deal with the
structure of a legacy database, you'll save yourself a lot of trouble.

-Rob

Rob Biedenharn    http://agileconsultingllc.com
Rob@AgileConsultingLLC.com
This topic is locked and can not be replied to.