RoR中的模型关联

时间:2012-03-24 19:09:35

标签: ruby-on-rails ruby activerecord

我正在尝试了解rails如何在外键和主键方面工作。来自纯SQL背景的Rails方法对我来说似乎很陌生。 我有以下两个迁移:

群组

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列标识,并使用我需要获取属于单个组的事件! 我该怎么做!

1 个答案:

答案 0 :(得分:2)

我看到你在迁移过程中将group_id和event_id作为字符串,所以我认为你可能会错过一个rails约定。 rails约定是所有表都有一个名为id的类型为integer的主键,任何外键都以模型的名称引用它,单数,+ _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

此时,rails知道通过约定对配置做什么:要查找事件的组,它知道查找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