# Non Default :primary\_key doesnt get updated

**URL:** <https://www.ruby-forum.com/t/non-default-primary-key-doesnt-get-updated/156308>\
**Category:** Rails\
**Created:** [December 24, 2008, 9:42am UTC](https://www.ruby-forum.com/t/non-default-primary-key-doesnt-get-updated/156308 "2008-12-24T09:42:29Z")\
**Posts on this page:** 9\
**Page:** 1

<div class="post-metadata">

**Author:** ![sudhakar\_m](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/c67d28/32.png) [@sudhakar\_m](https://www.ruby-forum.com/u/sudhakar_m)\
**Post date:** [December 24, 2008, 9:42am UTC](https://www.ruby-forum.com/t/non-default-primary-key-doesnt-get-updated/156308/1 "2008-12-24T09:42:29Z")

</div>

Hi,

I have to use non default primary key in one of my projects. If i save  
the  
record, the primary key is not getting updated.

For example, consider

_post.rb_  
class Post \< ActiveRecord::Base  
set\_primary\_key :ida2a2  
end

_schema.rb_  
create\_table “posts”, :id =\> false, :force =\> true do |t|  
t.integer “ida2a2”  
t.string “title”  
t.text “body”  
t.datetime “created\_at”  
t.datetime “updated\_at”  
end

_In console_

> > p = Post.new(:ida2a2 =\> 1, :title =\> “First Post”, :body =\> “jsust a test  
> > i”)  
> > =\> #\<Post ida2a2: nil, title: “First Post”, body: “jsust a test i”,  
> > created\_at: nil, updated\_at: nil\>
> 
> > p.save  
> > =\> true
> 
> > p  
> > =\> #\<Post ida2a2: 1, title: “First Post”, body: “jsust a test i”,  
> > created\_at: “2008-12-24 08:23:53”, updated\_at: “2008-12-24 08:23:53”\>
> 
> >

?\> Post.first  
=\> #\<Post ida2a2: nil, title: “First Post”, body: “jsust a test i”,  
created\_at: “2008-12-24 08:23:53”, updated\_at: “2008-12-24 08:23:53”\>

> >

After saving, ida2a2 becomes nil.

Tried with different combination’s, but no success. Can somebody help me  
here.

Thanks,  
Sudhakar.M

---

<div class="post-metadata">

**Author:** ![sudhakar\_m](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/c67d28/32.png) [@sudhakar\_m](https://www.ruby-forum.com/u/sudhakar_m)\
**Post date:** [December 24, 2008, 10:48am UTC](https://www.ruby-forum.com/t/non-default-primary-key-doesnt-get-updated/156308/2 "2008-12-24T10:48:40Z")

</div>

is it the same, if you create a new Post without specifiying the  
primary key?

Post.new(  
:title =\> “my\_title”,  
:body =\> “my\_body”  
).save  
Post.find\_by\_title(“my\_title”)

---

<div class="post-metadata">

**Author:** ![sudhakar\_m](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/c67d28/32.png) [@sudhakar\_m](https://www.ruby-forum.com/u/sudhakar_m)\
**Post date:** [December 24, 2008, 11:19am UTC](https://www.ruby-forum.com/t/non-default-primary-key-doesnt-get-updated/156308/3 "2008-12-24T11:19:42Z")

</div>

Hi MaD,

Tried it but same result.

> > Post  
> > =\> Post(ida2a2: integer, title: string, body: text, published: boolean,  
> > created\_at: datetime, updated\_at: datetime)
> 
> > Post.new(:title =\> “First Post”, :body =\> “jsust a test i”).save  
> > =\> true
> 
> > Post.first  
> > =\> #\<Post ida2a2: nil, title: “First Post”, body: “jsust a test i”,  
> > published: nil, created\_at: “2008-12-24 10:00:50”, updated\_at:  
> > “2008-12-24  
> > 10:00:50”\>

Hope I am not missing something obvious here. BTW I am using sqllite. I  
have  
made only 2 changes after generating the model.

1.) :id =\> false for post table  
2.) In post.rb added set\_primary\_key :ida2a2

But the same issue occurs again & again.

Thanks,  
Sudhakar.M

---

<div class="post-metadata">

**Author:** ![sudhakar\_m](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/c67d28/32.png) [@sudhakar\_m](https://www.ruby-forum.com/u/sudhakar_m)\
**Post date:** [December 24, 2008, 11:41am UTC](https://www.ruby-forum.com/t/non-default-primary-key-doesnt-get-updated/156308/4 "2008-12-24T11:41:31Z")

</div>

Okie got it.

WARNING: Can’t mass-assign these protected attributes: ida2a2  
Post Create (0.0ms) INSERT INTO “posts” (“updated\_at”, “title”, “body”,  
“id”, “created\_at”) VALUES(‘2008-12-24 10:33:56’, ‘First Post’, ‘jsust a  
test i’, NULL, ‘2008-12-24 10:33:56’)

Thanks for the lead. But how to assign values in this case.

I guess i need to write a method in post.rb for before\_save hook.

Any other suggestion?

Sudhakar.M

---

<div class="post-metadata">

**Author:** ![sudhakar\_m](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/c67d28/32.png) [@sudhakar\_m](https://www.ruby-forum.com/u/sudhakar_m)\
**Post date:** [December 24, 2008, 12:10pm UTC](https://www.ruby-forum.com/t/non-default-primary-key-doesnt-get-updated/156308/5 "2008-12-24T12:10:53Z")

</div>

try the following:

post = Post.new(:title =\> “This works”, :body =\> “at least for me it  
does”)  
post.ida2a2 = 234  
post.save  
Post.last

---

<div class="post-metadata">

**Author:** ![sudhakar\_m](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/c67d28/32.png) [@sudhakar\_m](https://www.ruby-forum.com/u/sudhakar_m)\
**Post date:** [December 24, 2008, 11:27am UTC](https://www.ruby-forum.com/t/non-default-primary-key-doesnt-get-updated/156308/6 "2008-12-24T11:27:19Z")

</div>

what’s in your log when you execute these commands?

---

<div class="post-metadata">

**Author:** ![sudhakar\_m](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/c67d28/32.png) [@sudhakar\_m](https://www.ruby-forum.com/u/sudhakar_m)\
**Post date:** [December 25, 2008, 1:22pm UTC](https://www.ruby-forum.com/t/non-default-primary-key-doesnt-get-updated/156308/7 "2008-12-25T13:22:27Z")

</div>

Just to make sure you understand: t.integer “ida2a2” does not create  
primary key. All it does is create integer column name ida2a2. To  
create real primary key use t.primary\_key “ida2a2”.

---

<div class="post-metadata">

**Author:** ![sudhakar\_m](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/c67d28/32.png) [@sudhakar\_m](https://www.ruby-forum.com/u/sudhakar_m)\
**Post date:** [December 24, 2008, 12:51pm UTC](https://www.ruby-forum.com/t/non-default-primary-key-doesnt-get-updated/156308/8 "2008-12-24T12:51:20Z")

</div>

Hi MaD,

Yes it worked. Thanks again. I was infact looking at wrong place by  
using  
attr\_writer :ida2a2.

Thanks,  
Sudhakar.M

2008/12/24 MaD [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)

---

<div class="post-metadata">

**Author:** ![sudhakar\_m](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/c67d28/32.png) [@sudhakar\_m](https://www.ruby-forum.com/u/sudhakar_m)\
**Post date:** [December 26, 2008, 11:28pm UTC](https://www.ruby-forum.com/t/non-default-primary-key-doesnt-get-updated/156308/9 "2008-12-26T23:28:57Z")

</div>

To create real primary key use t.primary\_key “ida2a2”.

Is it different from t.integer “ida2a2”, :primary\_key or “ida2a2”,  
:primary\_key =\> true . I tried both these things but they didnt set  
ida2a2  
as primary key in table. t.primary\_key “ida2a2” looks more appropriate.
