Raylar kullanarak, nasıl tamsayı yazılan bir sütun için birincil anahtar ayarlayabilirim?
Ben kullanıyorum Raylar göçler yönetmek veritabanı şeması ve ben oluşturmak basit bir tablo nerede isterdim kullanın tamsayı olmayan bir değer olarak birincil anahtar (belirli bir dize). Benim sorunum uzak soyut, çalışanların alfasayısal bir dize, örneğin "134SNW"
tarafından tanımlanan bir Tablo employees
var ki.
Böyle bir geçiş tablosu oluşturmaya çalıştım:
create_table :employees, {:primary_key => :emp_id} do |t|
t.string :emp_id
t.string :first_name
t.string :last_name
end
Bu bana ne verir tamamen hattı t.string :emp_id
görmezden gelip devam ettim ve bir tamsayı sütun yapılmış gibi görünüyor. Başka bir yol raylar PRİMARY_KEY kısıtlaması (PostgreSQL kullanıyorum) oluşturmak execute
bir ara SQL yazmak zorunda kalmadan benim için, var mı?
NOTEn iyi birincil anahtar olarak dize sütunları kullanın, cevap yok sadece tamsayı birincil anahtar ekleyin diyor lütfen öyle olmadığını biliyorum. Yine de bir tane eklemek istiyorum, ama bu soru hala geçerli.
CEVAP
Ne yazık ki, mümkün execute
kullanmadan olmadığını tespit ettik.
Neden çalışmıyor
ActiveRecord kaynağını inceleyerek, create_table
kodunu bulabiliriz:
def create_table(table_name, options={})
...
table_definition.primary_key(options[:primary_key] || Base.get_primary_key(table_name.to_s.singularize)) unless options[:id] == false
...
end
Biz de o zaman deneyin belirtmek için bir birincil anahtar create_table
seçenekler yaratıyor, bir birincil anahtar ile belirtilen adı (veya varsa hiçbiri, belirtilen id
). Bir tablo içinde kullanabilirsiniz aynı yöntemi tanımı blok çağırarak bunu yapar: primary_key
.
def primary_key(name)
column(name, :primary_key)
end
Bu sadece türü belirtilen ada sahip bir sütun oluşturur :primary_key
. Bu standart veritabanı adaptörleri aşağıdaki gibi ayarlanır:
PostgreSQL: "serial primary key"
MySQL: "int(11) DEFAULT NULL auto_increment PRIMARY KEY"
SQLite: "INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL"
Geçici çözüm
Beri mecburuz bu birincil anahtar olarak türleri var execute
oluşturmak için bir birincil anahtar olmayan bir tamsayı (PostgreSQL serial
bir tamsayı kullanarak bir dizi):
create_table :employees, {:id => false} do |t|
t.string :emp_id
t.string :first_name
t.string :last_name
end
execute "ALTER TABLE employees ADD PRIMARY KEY (emp_id);"
Sean McCleary mentioned, ActiveRecord model birincil anahtar set_primary_key
kullanarak ayarlamanız gerekir
class Employee < ActiveRecord::Base
set_primary_key :emp_id
...
end
Nasıl sütun Raylar geçiş kullanarak da...
Nasıl sıfırlamak için PostgreSQL'...
Ben başvuru belirli bir tablo yabancı ...
Nasıl SQL anahtar kelimeler benzeyen S...
Nasıl otomatik artan PostgreSQL birinc...