Rails-миграция предполагает отношения, в которых ее нет - PullRequest
1 голос
/ 23 марта 2012

У меня есть приложение Rails 3.1 с моделью User и моделью Venue. Эти две модели имеют отношения HABTM - пользователь может управлять многими объектами, а объектом может управлять множество пользователей.

Я бы хотел, чтобы пользователи могли выбирать место по умолчанию, поэтому я пытаюсь добавить атрибут default_venue_id к User со следующей миграцией:

class AddDefaultVenueIdToUser < ActiveRecord::Migration
  def self.up
    add_column :users, :default_venue_id, :integer
  end

  def self.down
    remove_column :users, :default_venue_id
  end
end

Проблема в том, что когда я запускаю эту миграцию для своей базы данных PostgreSQL, предполагается, что default_venue_id является внешним ключом для связи с несуществующей таблицей default_venues и выдает следующую ошибку:

PGError: ERROR:  relation "default_venues" does not exist
: ALTER TABLE "users" ADD FOREIGN KEY ("default_venue_id") REFERENCES "default_venues" ("id")

Должен ли я что-то делать, чтобы сообщить базе данных, что я не пытаюсь создать отношения или я поступаю неправильно?

Редактировать: Я только что понял, что другой разработчик, который работал над проектом, добавил гем schema_plus , который автоматически определяет ограничения для столбцов, заканчивающихся на _id

Это объясняет, почему я никогда не сталкивался с таким поведением раньше!

Ответы [ 2 ]

1 голос
/ 23 марта 2012

Поскольку Rails, кажется, берет часть тега _id и пытается связать его с таблицей, простое решение - попытаться назвать его по-другому, так как соглашение говорит, что поле с _id связывается с таблицей.

Примером может быть :default_id_for_venue или просто :defualt_venue

1 голос
/ 23 марта 2012

Было бы полезно посмотреть Модели и для диагностики этой проблемы.

Однако, с учетом сказанного, я думаю, что если вы используете HABTM ассоциации здесь, возможно, будет хорошей идеей взглянуть на отношения «есть много». Пример: VenueManagement, который будет иметь ваши user_id и venue_id. Таким образом, вы можете обрабатывать дополнительные атрибуты в ассоциации, где это имеет смысл, например, флаг по умолчанию.

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

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