ActiveRecord выдает ошибку SQL «нет такого столбца» для простой ассоциации has_many - PullRequest
3 голосов
/ 19 июля 2010

Это сводит меня с ума!Этот код работал нормально, но несколько недель назад он перестал работать, и я не могу понять, почему.В основном игра имеет много патчей.Ошибка возникает в моем PatchesController, но она воспроизводится в консоли rails следующим образом:

first_game = Game.find(:first)
first_game.patches

Как только я использую метод исправлений, я получаю это:

ActiveRecord::StatementInvalid: SQLite3::SQLException: no such column: patches.game_true: SELECT * FROM "patches" WHERE ("patches".game_true = 1) 
    from /project_root/vendor/rails/activerecord/lib/active_record/connection_adapters/abstract_adapter.rb:221:in `rescue in log'
    from /project_root/vendor/rails/activerecord/lib/active_record/connection_adapters/abstract_adapter.rb:204:in `log'
    from /project_root/vendor/rails/activerecord/lib/active_record/connection_adapters/sqlite_adapter.rb:172:in `block in execute'
    from /project_root/vendor/rails/activerecord/lib/active_record/connection_adapters/sqlite_adapter.rb:417:in `catch_schema_changes'
    from /project_root/vendor/rails/activerecord/lib/active_record/connection_adapters/sqlite_adapter.rb:172:in `execute'
    from /project_root/vendor/rails/activerecord/lib/active_record/connection_adapters/sqlite_adapter.rb:320:in `select'
    from /project_root/vendor/rails/activerecord/lib/active_record/connection_adapters/abstract/database_statements.rb:7:in `select_all'
    from /project_root/vendor/rails/activerecord/lib/active_record/connection_adapters/abstract/query_cache.rb:62:in `select_all_with_query_cache'
    from /project_root/vendor/rails/activerecord/lib/active_record/base.rb:664:in `find_by_sql'
    from /project_root/vendor/rails/activerecord/lib/active_record/base.rb:1578:in `find_every'
    from /project_root/vendor/rails/activerecord/lib/active_record/base.rb:618:in `find'
    from /project_root/vendor/rails/activerecord/lib/active_record/associations/association_collection.rb:60:in `find'
    from /project_root/vendor/rails/activerecord/lib/active_record/associations/association_collection.rb:400:in `find_target'
    from /project_root/vendor/rails/activerecord/lib/active_record/associations/association_collection.rb:354:in `load_target'
    from /project_root/vendor/rails/activerecord/lib/active_record/associations/association_proxy.rb:140:in `inspect'
    from /usr/local/bin/irb:12:in `<main>'

Теперь, когдаSQL должен действительно сказать «ГДЕ patches.game_id = 1», если я не схожу с ума.Я понятия не имею, почему он генерирует этот SQL!

Вот модели / game.rb:

class Game < ActiveRecord::Base
  has_many :patches
end

Вот модели / patches.rb:

class Patch < ActiveRecord::Base
  belongs_to :game
end

ИТаблица патчей содержит 'game_id' и 3 записи, все для первой игры.Если я получу один из патчей и перейду на my_patch.game, он вернет объект Game, к которому он принадлежит, без проблем.Любая помощь будет принята с благодарностью!

Ответы [ 3 ]

3 голосов
/ 19 декабря 2012

Мне удалось выяснить проблему. Это было в моем файле миграции. Я использовал помощник ссылок в моем файле миграции.

def up
create_table :reviews do |t|
    t.integer       :potatoes
    t.text          :comments
    t.references    :moviegoer
    t.references    :movie
end

Я неправильно написал название модели родительского класса. Исправил имя, затем сбросил мою базу данных и пересоздал ее грабли дб: падение грабли дБ: мигрировать

0 голосов
/ 02 августа 2010

ммм глупый вопрос, но разве эта обратная трассировка не утверждает, что отсутствующий столбец называется "game_true" (в таблице патчей)?Я не думаю, что он утверждает, что нет колонки под названием «заплатки».

SQLException: no such column: patches.game_true: SELECT * FROM "patches" WHERE ("patches".game_true = 1)

Это должно измениться, куда вам нужно пойти посмотреть.

0 голосов
/ 19 июля 2010

Похоже, вы меняете имя первичного ключа по какой-то причине. Убедитесь, что у вашего класса Game нет ничего подобного:

class Game < ActiveRecord::Base
  # Form #1
  self.primary_key = true

  # Form #2
  set_primary_key true
end

Это можно использовать для переименования столбца первичного ключа из 'id' в нечто произвольное, что в вашем случае выглядит как 'true'.

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