Объявление ассоциаций в Ruby on Rails - PullRequest
2 голосов
/ 11 марта 2011

Надеюсь, я не слишком огорчился из-за этого - я изо всех сил пытался найти ответ безрезультатно.

Мне было интересно, может ли кто-нибудь помочь мне понять, как правильно объявлять ассоциации в Ruby on Rails (3). На данный момент у меня 3 модели:

#room.rb
class Room < ActiveRecord::Base
  has_many :check_ins
end

#check_in.rb
class CheckIn < ActiveRecord::Base
  belongs_to :user
  belongs_to :room
end

#user.rb
class User < ActiveRecord::Base
  has_one :check_in
end

До сих пор я не выполнял никаких миграций для добавления столбцов foreign_key в какие-либо из моих таблиц (Rails делает это для вас?).

Я не совсем понимаю, почему команда CheckIn.first.user возвращает nil, а команда User.first.check_in возвращает SQLite3::SQLException: no such column. То же самое происходит с CheckIn.first.room и Room.first.check_ins соответственно. Что мне нужно сделать, чтобы User.first.check_in возвратил объект CheckIn, связанный с первым пользователем, и Room.first.check_ins вернул набор CheckIns, связанный с первой комнатой?

Любая помощь будет принята с благодарностью.

Charlie

Ответы [ 3 ]

4 голосов
/ 11 марта 2011

Как вы изначально создали эти модели? Вы только что создали файлы модели или использовали генератор моделей rails (который также генерирует миграцию для вас)?

#room.rb
class Room < ActiveRecord::Base
  has_many :check_ins
end

#check_in.rb
class CheckIn < ActiveRecord::Base
  belongs_to :user
  belongs_to :room
end

#user.rb
class User < ActiveRecord::Base
  has_one :check_in
  has_one :room, :through => :check_in
end

В db / migrations / 34612525162_something_something.rb Вы должны убедиться, что у вас есть миграции, которые настраивают эти таблицы для вас. Самый простой способ сделать это - запустить эту команду в консоли, изменить команды для использования нужных полей, поля * _id необходимы для работы ваших ассоциаций:

rails generate model user name:string email:string otherfield:integer
rails generate model check_in user_id:integer room_id:integer
rails generate model room number:integer

Обратите внимание, что они также будут генерировать файлы модели для вас, так как у вас уже есть эти 3 файла модели, он спросит вас, хотите ли вы перезаписать их или пропустить файлы. Вы можете пропустить их, и это должно быть просто отлично. Если у вас уже были миграции для части данных в этих моделях, вы можете просто добавить поля user_id и room_id в модель check_in, запустив этот генератор вместо :

rails generate migration AddIdsToCheckIn user_id:integer room_id:integer

Для рельсов 2.3.x заменить rails generate на script/generate. Затем вы можете проверить ваши миграции, открыв файлы в db/migrate.rb и изменив их там, если вам нужно. Наконец, запустите миграцию:

rake db:migrate

И это должно сработать для вас. Обратите внимание, что я добавил отношение has_one, :through => к пользователю - это так, что вы можете сделать @user.room без необходимости создавать 3 цепочки: @user.check_in.room

0 голосов
/ 11 марта 2011

Нет абсолютно никаких причин, чтобы разжечь огонь, не волнуйтесь :) Кажется, здесь вы пытаетесь установить связь один ко многим, но на самом деле вы делаете связь один ко многим.

Если у пользователя есть одна регистрация, это означает, что у него есть одна комната. Итак, вы могли бы просто иметь:

пользователь has_one room комната принадлежит пользователю

и в комнате есть user_id.

Надеюсь, это поможет:)

0 голосов
/ 11 марта 2011

Вам необходимо добавить миграции самостоятельно (или, если вы не живы, вы можете изменить существующую миграцию). По сути, вам нужно присвоить стороне принадлежащих отношений внешний ключ.

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