2010-01-18 61 views
0

我試圖創造有1名作家和藝術家1一本漫畫書的模式。這些都是一個人的實例。但是,如何在遷移中顯示此內容?Ruby on Rails的更名外鍵

class CreateComics < ActiveRecord::Migration 
    def self.up 
    create_table :comics do |t| 
     t.column :name, :string  
     t.column :writer_id, :integer, :null => false 
     t.column :artist_id, :integer, :null => false 
    end 
    end 
... 

我怎麼說:writer_id應該映射到:爲person_id或者是這種重命名時皺起了眉頭?

回答

4

創建使用CLASS_NAME和foreign_key選項,在你的模型類的映射。

belongs_to :writer, :class_name => "Person", :foreign_key => "writer_id" 
belongs_to :artist, :class_name => "Person", :foreign_key => "artist_id" 
+0

謝謝。這是不是說我的mySQL永遠不會獲得外鍵的知識? – Stickboy 2010-01-18 22:16:09

+0

您可以在遷移中添加外鍵約束。我創建了一個遷移助手在SQL Server中要做到這一點,你應該能夠做同樣的事情爲MySQL或使用插件像這樣的:http://agilewebdevelopment.com/plugins/foreign_key_migrations – MattMcKnight 2010-01-19 13:49:33

+0

@MattMcKnight嘿馬特,剛出來的好奇心是你開源還是依靠你的移民幫手?我爲MySQL創建了類似的幫助器,並希望將它放在那裏供其他人使用。 – 2014-04-30 14:20:04

1

遷移並不知道您打算如何使用其中定義的表。所有這些信息都在模型中進行。

總之遷移是罰款,你所描述會做什麼。但是你需要充實模型來定義你想要的關聯。

class Comic < ActiveRecord::Base 
    belongs_to :writer, :class_name => "Person" 
    belongs_to :artist, :class_name => "Person" 
end 

這允許您從漫畫中引用作者和藝術家。但是,您可能會想要對該協會進行回報,以便您可以根據其在生產中的角色輕鬆獲取漫畫。

class Person < ActiveRecord::Base 
    has_many :comics_as_writer, :class_name => "Comic", :foreign_key => :writer_id 
    has_many :comics_as_artist, :class_name => "Comic", :foreign_key => :artist_id 

    # some times you don't care what a person did for a comic, 
    # you just want to know what they worked on. 
    has_many :comics, :finder_sql => "SELECT comics.* FROM comics, people WHERE " + 
    "`comics`.`writer_id` = `people`.`id` OR " + 
    " `comics`.`artist_id` = `people`.`id`" 
end 

隨着定義了以下這些關係是可能的:

@comic.artist # => Person with id matching comics.artist_id 
@comic.writer # => Person with id matching comics.writer_id 

@person.comics_as_writer # => Array of comics where @person.id matches comics.writer_id 
@person.comics_as_artist # => Array of comics where @person.id matches comics.artist_id 

@person.comics # => Array of comics where @person.id matches comics.writer_id or comics.artist_id 
+0

感謝您的回覆。這是我將前往的地方。這是不是意味着在人類課堂? – Stickboy 2010-01-18 22:20:09

+0

好的。我糾正了錯誤。 – EmFi 2010-01-19 03:09:00

+0

對於最近的評論,我剛剛嘗試過實現這一點。這一切都正常工作,直到我打電話<% @person.comics.each do |comic| %><%= comic.name %><% end %>這打印出人的名稱,而不是漫畫。我錯過了什麼嗎?當我做comic.class時,它就會報告漫畫。 對不起,我已經忘記了如何在這裏格式化的東西...... – Stickboy 2010-01-27 14:39:36