วิธีสร้างการย้ายข้อมูลเพื่อสร้างความหลากหลายของการอ้างอิง


121

ฉันมีตารางผลิตภัณฑ์และต้องการเพิ่มคอลัมน์:

t.references :imageable, :polymorphic => true

ฉันพยายามสร้างการย้ายข้อมูลสำหรับสิ่งนี้โดยทำ:

$ rails generate migration AddImageableToProducts imageable:references:polymorphic

แต่เห็นได้ชัดว่าฉันทำผิด มีใครให้คำแนะนำได้ไหม ขอบคุณ

เมื่อฉันพยายามใส่มันด้วยตนเองหลังจากสร้างการย้ายข้อมูลฉันก็ทำเช่นนี้:

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

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

และยังไม่ได้ผล


ไม่ใช่คำตอบ แต่เพื่อหลีกเลี่ยงความสับสนคุณแน่ใจหรือไม่ว่าต้องการคอลัมน์นี้ในผลิตภัณฑ์ คู่มือรางยังมีตัวอย่างผลิตภัณฑ์และคอลัมน์อยู่ใน Pictures guide.rubyonrails.org/…
atomkirk

คำตอบ:


109

เท่าที่ฉันรู้ไม่มีเครื่องกำเนิดไฟฟ้าในตัวสำหรับการเชื่อมโยงหลายรูปแบบ สร้างการย้ายข้อมูลเปล่าแล้วปรับเปลี่ยนด้วยมือตามความต้องการของคุณ

อัปเดต : คุณจะต้องระบุตารางที่คุณกำลังเปลี่ยนแปลง ตามคำตอบ SO นี้ :

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

ขอบคุณแบรนดอนมาก ฉันสามารถเรียกใช้การย้ายข้อมูลได้ ฉันสงสัยว่าหลังจากที่คุณทำ: polymorphic => true และคุณเปิด schema.rb คุณควรจะเห็นมันในสคีมาด้วยหรือไม่?
raillearner

หลังจากที่คุณเรียกใช้การย้ายที่schema.rbควรได้รับการปรับปรุง polymorphicแต่มันจะไม่พูดอะไรเกี่ยวกับ คุณควรเห็นฟิลด์จริงที่ Rails ใช้แทน ( Rails Guidesมีข้อมูลเพิ่มเติม)
Michelle Tilley

2
คุณจะเพิ่มดัชนีลงในreferencesคอลัมน์ได้อย่างไร? ฉันต้องจัดทำดัชนีหรือไม่
mrudult

@mrudult ถ้าฉันจำไม่ผิดคุณต้องเพิ่มเองถ้าคุณต้องการ คุณสามารถเพิ่มดัชนีตามปกติในไฟล์การย้ายข้อมูลไปยังimageable_typeและ / หรือimageable_idตามความจำเป็น
Michelle Tilley

2
ได้. เพิ่มดัชนีimageable_idและimageable_typeทำงาน ขอบคุณสำหรับความช่วยเหลือของคุณ.
mrudult

266

สิ่งที่คุณกำลังพยายามทำยังไม่ได้นำไปใช้ในรางรุ่นที่เสถียรดังนั้นคำตอบของ Michelle จึงเป็นคำตอบที่ถูกต้องในตอนนี้ แต่คุณลักษณะนี้จะถูกนำไปใช้ในราง 4 และมีให้ใช้งานแล้วในรุ่น edge ดังต่อไปนี้ (ตามCHANGELOGนี้):

$ rails generate migration AddImageableToProducts imageable:references{polymorphic}

1
ลองสิ่งนี้ใน 4.2 และฉันไม่แน่ใจว่านี่เป็นข้อผิดพลาด zsh หรืออย่างอื่น แต่บรรทัดคำสั่งถูกตีความเป็นชุดของการอ้างอิง (เป็นประเภท) ด้วยตัวอักษรแต่ละตัวของความหลากหลายเช่น: t.referencesp: จินตนาการได้ , treferenceso: จินตนาการได้ ฯลฯ
OzBarry

10
@OzBarry ใน zsh คุณจะต้องออกจากวงเล็บปีกกา: $ rail สร้างการย้ายข้อมูล AddImageableToProducts imageable: references \ {polymorphic \}
chad_

4
สำหรับใครก็ตามที่อยากรู้อยากเห็นสิ่งนี้จะทำให้เกิดการโยกย้ายด้วยวิธีการเปลี่ยนแปลงที่มี:add_reference :products, :imageable, polymorphic: true, index: true
stevenspiel

1
ในกรณีที่ใครก็ตามที่พยายามใช้แบบเดียวกันนี้ในนั่งร้านก็ใช้ได้กับนั่งร้านเช่นกัน ขอบคุณ! rijks
sghosh968

2
{polymorphic}ต้องหนีด้วยเปลือกปลาเช่น\{polymorphic\}
Dorian

36

คุณสามารถทำสิ่งต่อไปนี้ได้:

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

16

คุณสามารถลอง rails generate migration AddImageableToProducts imageable:references{polymorphic}


3
{และ}จำเป็นต้องหลบหนีด้วยเปลือกปลาอย่างน้อยเช่น\{polymorphic\}
Dorian

1
นี่คือลิงค์ไปยังเอกสารเกี่ยวกับเรื่องนี้: edgeguides.rubyonrails.org/…
Giovanni Benussi

ขอบคุณ Giovanni ที่มีประโยชน์มาก
hutusi
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.