SORU
29 Temmuz 2009, ÇARŞAMBA


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
16 EYLÜL 2009, ÇARŞAMBA


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:

schema_statements.rb:

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.

schema_statements.rb:

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

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • A Alkhaldi

    A Alkhaldi

    12 Mayıs 2007
  • JonnyEthco

    JonnyEthco

    5 EKİM 2006
  • KRQE

    KRQE

    6 AĞUSTOS 2007