2010-07-19 65 views
3

这让我疯狂!这段代码过去工作正常,但几个星期前它停止工作,我无法解决原因。基本上一场比赛有很多补丁。在我PatchesController出现的错误,但其在轨控制台这样的重复性:ActiveRecord为简单的has_many关联提供'没有这样的列'SQL错误

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应该说真的'WHERE 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对象,而不会出现任何问题。任何帮助将不胜感激!

+0

如果您手动设置关联关键字,它是否工作?了解你不应该设置它,我只是好奇,如果我们可以找出错误的地方。 – jasonpgignac 2010-07-19 13:50:35

+0

Patch.find(:all,:conditions => {:game_id => 1})工作正常! first_game.patches.find(:all,:conditions => {:game_id => 1})给出相同的错误,并生成此SQL: SELECT * FROM“patches”WHERE(“patches”.game_true = 1 AND(“patches”,“game_id”= 1)) – TheAdmiral 2010-07-19 14:46:58

回答

0

它看起来像你正在改变主键的名称出于某种原因。确保你的游戏类没有类似的东西:

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

    # Form #2 
    set_primary_key true 
end 

这可以用于从“身份证”的主键列重命名为任意的,而你的情况似乎是“真”。

+0

不幸的是,Game类的整个代码都在原始文章中。 :(我通过我的项目文件进行了搜索,并且唯一一次'primary_key'和'set_primary_key'显示在冻结轨道上。 – TheAdmiral 2010-07-19 14:57:35

+0

我创建了一个临时Rails 2.3.5项目并生成了一个像你一样的Game和Patch类在这里,但它工作正常,你使用了什么后端?这可能是一个数据库的问题。你可以复制这与sqlite3引擎,例如? – tadman 2010-07-19 15:08:20

+1

我使用rails 2.3。8和sqlite3 ......我确实注意到ruby-sqlite3 gem的更新已经过去了一段时间,所以可能会破坏它。我会和MySQL一起去看看会发生什么。 – TheAdmiral 2010-07-19 15:26:20

0

ummm愚蠢的问题,但没有回溯声称失踪的列被称为“game_true”(在补丁表上)? 我不认为它声称没有称为“修补程序”的列。

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

这应该改变你需要去看看。

3

我能弄清楚这个问题。它在我的迁移文件中。我在迁移文件中使用了引用助手。

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

我拼错了父类的模型名称。更正名称,然后丢弃我的数据库并重新创建它 rake db:drop rake db:migrate