2012-03-24 93 views
1

我想了解Rails如何在外鍵和主鍵方面工作。來自純SQL背景的Rails方法對我來說似乎非常陌生。 我有以下兩個遷移:RoR中的模型協會

class CreateGroups < ActiveRecord::Migration 
    def self.up 
    create_table :groups do |t| 
     t.string :title 
     t.text :description 
     t.string :city 
     t.integer :event_id 
     t.string :zip 
     t.string :group_id 
     t.text :topics 
     t.timestamps 
    end 
    end 

    def self.down 
    drop_table :groups 
    end 
end 

和事件:

class CreateEvents < ActiveRecord::Migration 
    def self.up 
    create_table :events do |t| 
     t.string :title 
     t.string :description 
     t.string :city 
     t.string :address 
     t.time :time_t 
     t.date :date_t 
     t.string :group_id 
     t.timestamps 
    end 
    end 

    def self.down 
    drop_table :events 
    end 
end 

一個組可以有許多事件和事件可以屬於一個組。我有以下兩種模式:

class Event < ActiveRecord::Base 
belongs_to :group, :foreign_key => 'group_id' 

end 

class Group < ActiveRecord::Base 
attr_accessible :title, :description, :city, :zip, :group_id, :topics 
has_many :events 
end 

不知道如何指定外鍵和主鍵此。例如,一個組由group_id列標識,並使用該列我需要獲取屬於單個組的事件! 我該如何做到這一點!

+0

你不必明確指明瞭'belongs_to'了'foreign_key'名如果它是你的形式('associationname_id')。 – 2012-03-24 19:14:11

回答

2

我看到你的group_id和event_id是你的遷移中的字符串,所以我想你可能會缺少一個rails約定。軌道慣例是,所有的表都有一個名爲整型的ID的主鍵,任何外鍵由模型的名稱引用它,奇,+ _id:

table groups: 
    id: integer 
    name: string 


table events: 
    id: integer 
    name: string 
    group_id: integer 

從這個慣例,所有你必須在你的模型指定爲:

class Event < ActiveRecord::Base 
    belongs_to :group 
end 

class Group < ActiveRecord::Base 
    has_many :events 
end 

此時,鐵軌知道通過約定優於配置:若要查找事件的組,它知道如何尋找GROUP_ID(單數)來指代groups.id(複數表名)

event = Event.first #=> returns the first event in database 
group = event.group #=> returns the group object 

同樣,知道如何找到一組

group = Group.first #=> returns first group in database 
group.events   #=> returns an Enumerable of all the events 

中的所有事件有關詳細閱讀,閱讀rails guide on associations

+0

thnx DGM,我仍然需要添加事件到一個組的基礎上的組ID,這需要一個字符串...所以我有這樣的組:group A - group_id:「音樂」,組B - group_id:「技術「,然後我需要根據group_id向這些組添加事件 – bytebiscuit 2012-03-24 19:59:15

+0

您需要搜索具有所需名稱的組,然後使用它創建事件。例如,'Group.where(:title =>'music')。首先<< Event.new(event_attributes)' – DGM 2012-03-25 04:46:31

+0

沒有任何辦法可以通過關聯完成此操作......不必依賴於.where ?可能通過一個外鍵!? – bytebiscuit 2012-03-25 04:53:44