cách tạo di chuyển để tạo tham chiếu đa hình


121

Tôi có bảng Sản phẩm và muốn thêm một cột:

t.references :imageable, :polymorphic => true

Tôi đã cố gắng tạo di chuyển cho việc này bằng cách:

$ rails generate migration AddImageableToProducts imageable:references:polymorphic

nhưng rõ ràng là tôi đang làm sai. Ai có thể đưa ra bất kỳ đề nghị? Cảm ơn

Khi tôi cố gắng đưa nó vào theo cách thủ công sau khi tạo quá trình di chuyển, tôi đã làm như thế này:

class AddImageableToProducts < ActiveRecord::Migration
  def self.up
    add_column :products, :imageable, :references, :polymorphic => true
  end

  def self.down
    remove_column :products, :imageable
  end
end

và nó vẫn chưa hoạt động


Không phải là câu trả lời, nhưng để tránh nhầm lẫn, bạn có chắc chắn muốn cột này trên Sản phẩm không? Các ray dẫn thậm chí có một ví dụ sản phẩm và cột là trên Hình guides.rubyonrails.org/...
atomkirk

Câu trả lời:


109

Theo như tôi biết, không có trình tạo tích hợp nào cho các liên kết đa hình. Tạo một di chuyển trống và sau đó sửa đổi nó bằng tay theo nhu cầu của bạn.

Cập nhật : Bạn sẽ cần chỉ định bảng mà bạn đang thay đổi. Theo câu trả lời SO này :

class AddImageableToProducts < ActiveRecord::Migration
  def up
    change_table :products do |t|
      t.references :imageable, polymorphic: true
    end
  end

  def down
    change_table :products do |t|
      t.remove_references :imageable, polymorphic: true
    end
  end
end

Cảm ơn Brandon rất nhiều. Tôi đã có thể chạy quá trình di chuyển. Tuy nhiên, tôi đã tự hỏi, sau khi bạn tạo: polymorphic => true và bạn mở schema.rb, bạn có phải thấy nó trong lược đồ không?
railslearner

Sau khi bạn chạy quá trình di chuyển, schema.rbsẽ được cập nhật, nhưng nó sẽ không nói gì về polymorphic. Thay vào đó, bạn sẽ thấy các trường thực tế mà Rails sử dụng ( Hướng dẫn về Rails có thêm thông tin).
Michelle Tilley

2
Làm cách nào để bạn thêm chỉ mục vào referencescột? Tôi có cần lập chỉ mục đó không?
mrudult

@mrudult Nếu tôi không nhầm, bạn cần phải tự thêm chúng nếu cần. Bạn chỉ có thể thêm các chỉ mục như bình thường trong tệp di chuyển đến imageable_typevà / hoặc imageable_idkhi cần thiết.
Michelle Tilley

2
Đúng vậy. thêm chỉ mục vào imageable_idimageable_typehoạt động. Cảm ơn bạn đã giúp đỡ.
mrudult

266

Những gì bạn đang cố gắng làm vẫn chưa được triển khai trong phiên bản ổn định của rails vì vậy câu trả lời của Michelle là câu trả lời phù hợp cho bây giờ. Nhưng tính năng này sẽ được triển khai trong rails 4 và đã có sẵn trong phiên bản cạnh như sau (theo CHANGELOG này ):

$ rails generate migration AddImageableToProducts imageable:references{polymorphic}

1
Đã thử điều này trên 4.2 và tôi không chắc đây là lỗi, zsh hay thứ gì khác, nhưng dòng lệnh được hiểu là một loạt các tham chiếu (dưới dạng các loại) với mỗi chữ cái đa hình, như: t.referencesp: Tưởng tượng , treferenceso: có thể tưởng tượng, v.v.
OzBarry

10
@OzBarry, trong zsh, bạn cần phải thoát khỏi các dấu ngoặc nhọn: $ rails tạo di chuyển AddImagableToProducts có thể tưởng tượng được: reference \ {polymorphic \}
chad_

4
Đối với bất kỳ ai tò mò, điều này tạo ra một sự di chuyển với phương thức thay đổi có chứa:add_reference :products, :imageable, polymorphic: true, index: true
stevenspiel

1
Trong trường hợp bất kỳ ai cố gắng sử dụng cùng một giàn giáo, điều này cũng hoạt động với giàn giáo. Cảm ơn! rijks
sghosh968

2
{polymorphic}cần phải được thoát với vỏ cá, ví dụ\{polymorphic\}
Dorian

36

Bạn cũng có thể làm như sau:

class AddImageableToProducts < ActiveRecord::Migration
  def change
    add_reference :products, :imageable, polymorphic: true, index: true
  end
end

16

Bạn co thể thử rails generate migration AddImageableToProducts imageable:references{polymorphic}


3
{}cần phải được thoát với vỏ cá ít nhất, ví dụ:\{polymorphic\}
Dorian

1
Đây là liên kết đến tài liệu về điều này: edgeguides.rubyonrails.org/…
Giovanni Benussi

Cảm ơn Giovanni, điều đó rất hữu ích.
hutusi
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.