2012-02-12 243 views
0

這可能被認爲是rails 3 associations error的重新發布。但它是我無法理解的東西。但是,好的......繼承了這筆交易..我在這裏問了一個與表格模式有關的問題。該職位是what is bad in this table schema structure查詢內容爲:紅寶石上軌道協會新手

`CREATE TABLE "pages" (
    "id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, 
    "title" varchar(255), 
    "body" varchar(255), 
    "author" varchar(255), 
    "email" varchar(255), 
    "reference" varchar(255), 
    "created_at" datetime, 
    "updated_at" datetime);` 

我認爲我應該爲作者單獨的表,而這正是我試圖和搞砸了。任何人都可以告訴我這些協會究竟應該如何處理我的場景?我真的需要很好地理解ROR關聯。

編輯-1

這裏是我的網頁遷移代碼:

class CreatePages < ActiveRecord::Migration 
    def self.up 
    create_table :pages do |t| 
     t.string :title, :unique => true, :limit => 50 
     t.string :body, :limit =>255 
     t.string :email, :unique => true, :limit => 50 
     t.string :reference, :limit => 40 
     t.timestamps 
    end 

    end 

    def self.down 
    drop_table :pages 
    end 
end 

,這裏是我的作家遷移:

class CreateAuthors < ActiveRecord::Migration 
    def change 
    create_table :authors do |t| 
     t.string :author, :unique => true, :null => false, :limit => 50 
     t.timestamps 
    end 
    end 
end 
+0

你試過看導遊嗎? http://guides.rubyonrails.org/association_basics.html – MrDanA 2012-02-12 15:17:59

+0

@MrDanA是的,我看着它。但問題是我有一個與模型相關的窗體..當我從頁表中分離作者表時,我得到了一些錯誤,但我仍然無法糾正。我真的無法通過你寄給我的鏈接想到一個想法。 – Maverick 2012-02-12 15:24:58

+0

你得到什麼類型的錯誤?你發佈的問題只是「協會應該如何工作」,而不是「我的表單中出現錯誤」(這是一個不同的問題)。 – 2012-02-12 15:27:09

回答

1

如果我們認爲這通過在邏輯上,作者可能有許多頁面和頁面都屬於作者。如果是這種情況,我們可以通過鐵軌關係來表達這一點。

class Author < ActiveRecord::Base 
    has_many :pages 

class Page < ActiveRecord::Base 
    belongs_to :author 

爲了支持這一點,您需要創建一個遷移來確保頁表中有一個author_id列。 Rails負責其餘部分。你會得到所有的關係語義,如:

my_page.author.email 
my_page.author.name 

(假設你的Author類具有這樣的屬性)

注意,你不一定非得有一個Author類,如果你的用戶是你的作者。如果每一個作者是用戶(您使用您的用戶類認證和賬戶維護),你仍然可以參考用戶爲一類

class Page < ActiveRecord::Base 
    belongs_to :author, :class_name => "User" 

,它可以讓你保持好的筆者語義通過做的作者他們對你的用戶類。

最後一點,如果你想,當你刪除一個作家對象自動刪除與作者相關的任何頁面,您可以添加依賴Author類

class Author < ActiveRecord::Base 
    has_many :pages, :dependent => :destroy 
+0

感謝解釋隊友。我編輯了我的問題,並將我的遷移分類代碼。那裏需要改變什麼? – Maverick 2012-02-12 15:35:23

1

創建一個單獨的表的作者可能是一個好主意(儘管如果這已經適合你,並且你沒有任何性能問題,你可以保持原樣)。

@Marc Talbot已經給出了一個很好的答案,關於如何在你的Rails模型中設置關聯。當然,你也需要遷移你的數據庫。這是做什麼:

  1. 做一個名爲「作者」的表。除了主鍵「id」之外,它還應該有一個名爲「name」的字段以及「email」。您可以移動任何其他字段,這些字段在邏輯上對於同一作者而言從「頁面」到「作者」始終是相同的。
  2. 將一個整數字段「author_id」添加到「pages」中。
  3. 運行「頁面」中的現有條目。對於每個頁面,檢查作者是否已經在「作者」中。如果沒有,請將作者添加到「作者」,並在「作者」中填寫「姓名」,「電子郵件」和其他字段。將「author_id」設置爲從authors表中引用正確的ID。
  4. 刪除「作者」,「電子郵件」和其他從「頁面」移動的字段。
+0

alex ..不知道如何執行你提到的第三步? – Maverick 2012-02-12 17:18:07

+1

@mad_programmer,如果您在數據庫中沒有任何有價值的數據,則可以跳過B並擦除數據庫並重新開始。如果您確實有寶貴的數據,您只需要讓「作者」表中的所有作者,並將每個頁面的「author_id」指向「作者」表中的正確記錄。如果您在編寫該遷移時需要幫助,請發表其他評論。 – 2012-02-12 18:30:40

+0

我現在沒有任何表格。是的,我需要更多的幫助,我正在使用部分窗體來顯示'@ page'模型元素。我應該粘貼form.html.erb嗎?我只想知道應該如何使用該表單中的作者表元素並獲取保存的數據 – Maverick 2012-02-12 18:41:23