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