# Create\_table with unique combo

**URL:** <https://www.ruby-forum.com/t/create-table-with-unique-combo/165109>\
**Category:** Rails\
**Created:** [April 9, 2009, 6:42am UTC](https://www.ruby-forum.com/t/create-table-with-unique-combo/165109 "2009-04-09T06:42:27Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![slava](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/b487fb/32.png) [@slava](https://www.ruby-forum.com/u/slava)\
**Post date:** [April 9, 2009, 6:42am UTC](https://www.ruby-forum.com/t/create-table-with-unique-combo/165109/1 "2009-04-09T06:42:27Z")

</div>

I need to create a table replacing default integer id with a string id  
and making a combo of (id and version) unique primary key. Here is  
what I’ve got so far.

class CreateCatalogs \< ActiveRecord::Migration  
def self.up  
create\_table :catalogs, :id =\> false do |t|  
t.string :id, :limit =\> 20, :null =\> false  
t.string :version, :default =\> ‘01’

```
  t.timestamps
end

```

end

def self.down  
drop\_table :catalogs  
end  
end

---

<div class="post-metadata">

**Author:** ![slava](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/b487fb/32.png) [@slava](https://www.ruby-forum.com/u/slava)\
**Post date:** [April 9, 2009, 6:57am UTC](https://www.ruby-forum.com/t/create-table-with-unique-combo/165109/2 "2009-04-09T06:57:05Z")

</div>

alternatively if i leave default integer id as primary key I need to  
make sure combo of name and version are unique.

```
create_table :catalogs do |t|
  t.string :name
  t.string :version, :default => '01'
  t.timestamps
end
```

---

<div class="post-metadata">

**Author:** ![slava](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/b487fb/32.png) [@slava](https://www.ruby-forum.com/u/slava)\
**Post date:** [April 9, 2009, 7:15am UTC](https://www.ruby-forum.com/t/create-table-with-unique-combo/165109/3 "2009-04-09T07:15:15Z")

</div>

On Thu, Apr 9, 2009 at 6:56 AM, slava [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> >

To ensure uniqueness, you can add an index

add\_index :catalogs, [:name, :version], :unique =\> true

Andrew T.  
[http://ramblingsonrails.com](http://ramblingsonrails.com)  
[http://www.linkedin.com/in/andrewtimberlake](http://www.linkedin.com/in/andrewtimberlake)

“I have never let my schooling interfere with my education” - Mark Twain

---

<div class="post-metadata">

**Author:** ![slava](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/b487fb/32.png) [@slava](https://www.ruby-forum.com/u/slava)\
**Post date:** [April 9, 2009, 8:58am UTC](https://www.ruby-forum.com/t/create-table-with-unique-combo/165109/4 "2009-04-09T08:58:22Z")

</div>

hi slave,you can do it use the connection method of migration  
use it like ActiveRecord::Base.connection\_pool.checkout

2009/4/9 slava [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)

> 

–  
æ˜Žå¤©ä¼šæ›´å¥½

---

<div class="post-metadata">

**Author:** ![slava](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/b487fb/32.png) [@slava](https://www.ruby-forum.com/u/slava)\
**Post date:** [April 9, 2009, 7:16am UTC](https://www.ruby-forum.com/t/create-table-with-unique-combo/165109/5 "2009-04-09T07:16:25Z")

</div>

on the same subject…  
I need to ensure uniqness of name in a table. I tried setting collumn  
to unique (see below) but that did not work. I still can create  
records with same name field.

create\_table :properties do |t|  
t.string :name, :unique =\> true  
t.string :description

```
  t.timestamps
end
```
