Yanıtlar:
Manuel olarak yapın:
add_column :post, :author_id, :integer
ama şimdi, aittir_to ifadesini yarattığınızda, onu değiştirmeniz gerekecek, bu yüzden şimdi aramanız gerekecek
def post
belongs_to :user, :foreign_key => 'author_id'
end
schema_plus
gem kullanarak , t.references :category, index: true, foreign_key: true, references: :match_categories
göç dosyasında da benim için çalıştı.
Eğer tanımlıyorsanız Post
modeli tablo, ayarlayabilirsiniz references
, index
ve foreign_key
tek satırda:
t.references :author, index: true, foreign_key: { to_table: :users }
Mevcut bir tabloya referans ekliyorsanız, bunu yapabilirsiniz:
add_reference :posts, :author, foreign_key: { to_table: :users }
Not: için varsayılan değer index
true.
null
s. Bunlara izin vermemek için normal seçeneği ekleyin null: false
.
Gelen Raylar 4.2+ da ayarlayabilirsiniz yabancı anahtarlar , hem de db harika bir fikir olan .
Basit ilişkilendirmeler için bu, t.references
ekleme foreign_key: true
sırasında da yapılabilir , ancak bu durumda iki satıra ihtiyacınız olacak.
# The migration
add_reference :posts, :author, index: true
add_foreign_key :posts, :users, column: :author_id
# The model
belongs_to :author, class_name: "User"
references: :users
seçeneğe ihtiyacınız olduğundan emin değilim add_reference
. Dokümanlarda belgelendiğini görmüyorum ve benim tarafımda onsuz işe yarıyor gibi görünüyor.
Raylarda 4, postgresql ve schema_plus gem kullanırken sadece yazabilirsiniz
add_reference :posts, :author, references: :users
Bu, author_id
doğru şekilde başvuran bir sütun oluşturacaktır users(id)
.
Ve modelinde yazarsın
belongs_to :author, class_name: "User"
Unutmayın, yeni bir tablo oluştururken aşağıdaki gibi yazabilirsiniz:
create_table :things do |t|
t.belongs_to :author, references: :users
end
Not:
schema_plus
gem bütünüyle 5+ raylarıyla uyumlu değildir, ancak bu işlevsellik, raylar 5 ile uyumlu gem schema_auto_foreign_keys ( schema_plus'ın bir parçası) tarafından sunulmaktadır .
create_table
:t.references :author, references: :users
:references
gerçekten bir şey yapan herhangi bir kanıt bulamıyorum .
schema_plus
mücevheri yıllardır kullanıyorum ve aslında bu işlevselliği ekliyor. Cevabımı buna göre düzenledim.
t.references :col_name, references: other_table_name
fazladan mücevher yüklemeden çalışıyor gibi görünüyor .
Yabancı anahtar kullanmıyorsanız, diğer tablonun gerçek tablo adının ne olduğu önemli değildir.
add_reference :posts, :author
Rails 5'ten itibaren , yabancı anahtar kullanıyorsanız, yabancı anahtar seçeneklerinde diğer tablonun adını belirtebilirsiniz. ( tartışma için bkz https://github.com/rails/rails/issues/21563 )
add_reference :posts, :author, foreign_key: {to_table: :users}
Rails 5'ten önce yabancı anahtarı ayrı bir adım olarak eklemelisiniz:
add_foreign_key :posts, :users, column: :author_id
{to_table: :users}
alias_attribute (yeni_adı, eski_adı) çok kullanışlıdır. Sadece modelinizi ve ilişkinizi oluşturun:
rails g model Post title user:references
daha sonra modeli düzenleyin ve bir özellik takma adı ekleyin
alias_attribute :author, :user
Bundan sonra aşağıdaki gibi şeyler çalıştırabileceksiniz
Post.new(title: 'My beautiful story', author: User.first)