Миграция на Rails предполагает отношения там, где их нет.

У меня есть приложение 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 gem, который автоматически определяет ограничения для столбцов, оканчивающихся на _id

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


person Simon    schedule 23.03.2012    source источник


Ответы (2)


Было бы полезно также увидеть модели, чтобы диагностировать эту проблему.

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

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

person Matt Polito    schedule 23.03.2012
comment
Вы правы, в данном случае гораздо больше подходит многие сквозные. Спасибо! - person Simon; 23.03.2012

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

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

person BookOfGreg    schedule 23.03.2012
comment
Спасибо, я подозревал, что это может быть связано с _id, но я никогда раньше с этим не сталкивался. - person Simon; 23.03.2012
comment
Есть ли способ сказать Rails не ссылаться на таблицу? Не очень простое решение? например owner_id, который всегда является идентификатором пользователя. - person kbighorse; 10.04.2013