Модельные ассоциации в RoR - PullRequest
1 голос
/ 24 марта 2012

Я пытаюсь понять, как работает 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 Ответ

2 голосов
/ 24 марта 2012

Я вижу, у вас есть group_id и event_id в качестве строк в вашей миграции, поэтому я думаю, что вы могли пропустить соглашение rails. Соглашение 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

На этом этапе 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

Подробнее читайте в руководстве по рельсам по связям

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...