Raylar 3 taşıma: Referans sütunu eklensin mi?


162

Yeni bir ray oluşturduğumda 3 geçiş (örneğin)

rails g migration tester title:tester user:references

, her şey iyi çalışıyor ... Ancak ben satırları boyunca bir şey ile bir sütun eklerseniz:

rails g migration add_user_to_tester user:references

referans alanı tanınmıyor. Kısacası, soru şu: Komut satırından raylar geçişine nasıl bir başvuru sütunu ekleyebilirim?

Yanıtlar:


205

Rails 4.x kullanıyorsanız, şimdi bunun gibi referanslarla taşıma işlemleri oluşturabilirsiniz:

rails generate migration AddUserRefToProducts user:references

ray kılavuzlarında görebileceğiniz gibi



2
otomatik olarak oluşturulan ad yerine yabancı anahtar için bir sütun adı nasıl belirlersiniz?
j

@jwill polimorfik: kullanici: referanslar {polimorfik} kullanabilirsiniz.
Paulo Fidalgo

@PauloFidalgo Bunu nasıl yapacağınızı biraz açıklayabilir misiniz? bazı bağlantılar kılavuzu olabilir? (polimorfik hakkında konuşuyor)
Anwar


186

EDIT : Bu eski bir yanıttır ve Rails 4.x + için uygulanmamalıdır

Referans verilen sınıfınıza bir tamsayı kimliği kullanabildiğinizde referans eklemenize gerek yoktur.

Düz bir tamsayı yerine referans kullanmanın avantajının, modelin belongs_to ile önceden tanımlanmış olması ve modelin zaten oluşturulduğundan ve mevcut bir şeyi taşıdığınızda etkilenmeyeceğinden, amacın kaybolması olduğunu söyleyebilirim.

Bu yüzden bunun yerine bunu yapardım:

rails g migration add_user_id_to_tester user_id:integer

Ve sonra Tester modeline belongs_to: user öğesini manuel olarak ekleyin


9
Ancak bu, onu destekleyen veritabanlarında uygun yabancı anahtar kısıtlamaları yaratmayacak, değil mi?
abahgat

19
Hayır, afaik Rails, sizin için eklentiler eklemediğiniz sürece veritabanında asla yabancı anahtar kısıtlamaları oluşturmaz.
DanneManne

sadece bu yazı okuyor, pls nasıl sonuçta referans ekleyebilirim
El nino

13
kullanıcı ile dizin eklemeyi unutmayın: integer: index
rickypai

3
Cevap tarihli, @ Paulo'nun modern raylar için verdiği cevaba bakınız.
OneHoopyFrood

102

Büyük olasılıkla bu sütunda da bir dizine ihtiyacınız olacağını unutmayın.

class AddUserReferenceToTester < ActiveRecord::Migration
  def change
    add_column :testers, :user_id, :integer
    add_index  :testers, :user_id
  end
end

1
Neden? Bu, ilişkilerin çoğu ait olanlar için geçerli mi?
ahnbizcad

Gerçekten performans nedenlerinden ötürü ve ilişkinin diğer tarafında bir has_many / has_one varsa kullanışlı olur. Eğer geçmeyeceğinizden kesinlikle eminseniz user.testersdizini atlayabilirsiniz.
Eugene

1
rails g migration ...Üretilen add_reference :installs, :device, index: trueayrıca dizin oluşturur ki.
B Seven

49

Yukarıda belirtilen önceki iki adımla, yabancı anahtar kısıtlamasını hala kaçırıyorsunuz. Bu çalışmalı:

  class AddUserReferenceToTester < ActiveRecord::Migration
      def change
          add_column :testers, :user_id, :integer, references: :users
      end
  end

Buradaki tek gerçek cevap bu. Yabancı anahtar burada en kritik kısmı
user2490003

soruların beri doğru cevap rayları 3 sorar olarak bu işaretlenmesi gereken
Carlos Roque

35

Sen edebilir bir değişiklik göç başvuruları kullanın. Bu geçerli Rails 3.2.13 kodu:

class AddUserToTester < ActiveRecord::Migration
  def change
    change_table :testers do |t|
      t.references :user, index: true 
    end
  end
  def down
    change_table :testers do |t|
      t.remove :user_id
    end
  end
end

cf: http://apidock.com/rails/ActiveRecord/ConnectionAdapters/SchemaStatements/change_table


1
değiştirme ve azaltma yöntemleri? onun yerine yukarı ve aşağı yöntemleri değil mi?
MaicolBen

@MaicolBen evet, ayrıca aşağı yöntemini de bırakabilirsiniz.
Hut8

@MaicolBen Yöntem olmadan, Rails 3.2 kullanarak geri alırken downaldım ActiveRecord::IrreversibleMigration. Ayrıca değişim gerekiyordu changeiçin up.
Andrew Grimm

27

Çalıştırılması rails g migration AddUserRefToSponsors user:referencesaşağıdaki taşımayı oluşturur:

def change
  add_reference :sponsors, :user, index: true
end

Bu Rails'in hangi sürümü?
Andrew Grimm

8

Bir sütun eklerken bu sütunu bir tam sayı yapmanız ve mümkünse ray kurallarına uymanız gerekir. Durumunuz için zaten bir Test Cihazı ve Kullanıcı modelleri, test kullanıcıları ve kullanıcı tabloları olduğunu varsayıyorum.

Yabancı anahtarı eklemek için user_id (kural) adında bir tamsayı sütunu oluşturmanız gerekir:

add_column :tester, :user_id, :integer

Ardından test cihazı modeline bir belongs_to ekleyin:

class Tester < ActiveRecord::Base
  belongs_to :user
end

Ayrıca yabancı anahtar için bir dizin eklemek isteyebilirsiniz (bu, referansların sizin için zaten yaptığı bir şeydir):

add_index :tester, :user_id

8

Hile yapacak:

rails g migration add_user_to_tester user_id:integer:index

Bu da büyük olasılıkla isteyeceksiniz dizini ekler gibi.
bheeshmar

3

Komut satırı üzerinden modelinize referansları aşağıdaki şekilde ekleyebilirsiniz:

rails g migration add_column_to_tester user_id:integer

Bu, aşağıdaki gibi bir taşıma dosyası oluşturur:

class AddColumnToTesters < ActiveRecord::Migration
  def change
    add_column :testers, :user_id, :integer
  end
end

Her kullandığımda iyi çalışıyor ..


3

Raylar 4 için

Jeneratör sütun tipini referans olarak kabul eder (olarak da mevcuttur belongs_to).

Bu taşıma bir user_idsütun ve uygun bir dizin oluşturur:

$ rails g migration AddUserRefToProducts user:references 

oluşturur:

class AddUserRefToProducts < ActiveRecord::Migration
  def change
    add_reference :products, :user, index: true
  end
end

http://guides.rubyonrails.org/active_record_migrations.html#creating-a-standalone-migration

Raylar 3 için

Yardımcıya referanslar denir (olarak da kullanılabilir belongs_to).

Bu taşıma category_id, uygun türde bir sütun oluşturur . Sütun adını değil, model adını ilettiğinizi unutmayın. Aktif Kayıt _idsizin için ekler .

change_table :products do |t|
  t.references :category
end

Polimorfik belongs_toilişkilendirmeleriniz varsa, başvurular gerekli sütunların her ikisini de ekleyecektir:

change_table :products do |t|
  t.references :attachment, :polymorphic => {:default => 'Photo'}
end

Bir attachment_id sütunu ve attachment_typevarsayılan değeri olan bir dize sütunu ekler Photo.

http://guides.rubyonrails.org/v3.2.21/migrations.html#creating-a-standalone-migration

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.