2009-12-01 37 views
0

我在Rails中創建了一個應用程序,並生成了兩個模型,一個用於學生,另一個用於獲獎。使用選擇框(RoR)

rails students 

script/generate scaffold student given_name:string middle_name:string family_name:string date_of_birth:date grade_point_average:decimal start_date:date 

script/generate scaffold award name:string year:integer student_id:integer 

每個學生都可以有很多獎項,所以我給學生模型添加了has_many:獎項。我還增加了一個選擇框,讓用戶創建新的獎項的觀點:

<%= f.select :student_id, Student.find(:all).collect {|s| [s.name, s.id]} %> 

我的問題:如果我想給用戶沒有指定學生創造一個獎項的選項,我會怎麼修改選擇框讓他們做到這一點?

我是全新的Rails。謝謝!

回答

1

你所描述的是多對多的關係。你所做的只是一對多的關係。

在多對多關係中,您可以在每一邊定義許多獨立記錄,並使用連接表創建從一個到另一個的鏈接。

在一對多關係中,一方的每條記錄都是獨立的,而多方的每條記錄都依賴於它所鏈接的記錄。

例子從您的問題而產生:

多對多:每個學生都可以有很多獎項,但不需要被鏈接到一個獎項,以具有意義。每個獎項都可以由許多學生獲得,但不需要與學生聯繫以獲得意義。 StackOverflow的徽章就是一個很好的例子。

一對多:每個學生都可以獲得很多獎項,但不需要與獎勵相關聯以獲得意義。每個獎項僅適用於一名學生。

如何把你的一對多關係一對多的關係:

  1. 創建具有student_idaward_id列的awardings表。
  2. 從award表中刪除student_id列。
  3. 通知關係的ActiveRecord。

    class Student < ActiveRecord::Base 
        has_many :awardings 
        has_many :awards, :through => :awardings 
        ... 
    end 
    
    class Awarding < ActiveRecord::Base 
        belongs_to :student 
        belongs_to :award 
    end 
    
    class Award < ActiveRecord::Base 
        has_many :awardings 
        has_many :students, :through => :awardings 
    end 
    
  4. 更新您的表單以反映更改。

    使用多重選擇框或一系列複選框一次管理多個選擇框。這裏有很多教程。這是Railscast episode是過時的,但是一個好的開始。

P.S.如果您不檢查社區wiki框,則更有可能獲得答案。社區維基適用於非技術性問題,其答案很可能由多個用戶提高。