代码之家  ›  专栏  ›  技术社区  ›  jerhinesmith

没有ID的模型上的shoulda测试失败

  •  0
  • jerhinesmith  · 技术社区  · 16 年前

    我在Rails应用程序中创建了一个新模型。因为它是与另一个表的一对一关系,所以新模型不需要有ID列。一切正常,但出于某种原因,我对这个模型的所有测试都失败了。例如:

    should_validate_presence_of :first_name
    

    正在引发此错误:

    ActiveRecord::StatementInvalid: Mysql::Error: Unknown column 'my_new_table.id'
    in 'field list': SELECT `my_new_table`.id FROM `my_new_table` WHERE 
    (`my_new_table`.`some_other_column` IS NULL)  LIMIT 1
    

    是否需要ID列?如果是这样,有办法解决这个问题吗?

    4 回复  |  直到 16 年前
        1
  •  3
  •   MattMcKnight    16 年前

    出于Rails的目的,您是否将主键别名为?

    set_primary_key :my_fk_id
    
        2
  •  1
  •   samg    16 年前

    Rails希望您的模型有一个整数id列作为主键。您可以像@mattmcknight建议的那样将其设置为外键,但我建议您创建ID列,即使您不严格需要它。根据我的经验,它可以帮你减轻很多这样的头疼,而且基本上没有负面影响。

        3
  •  0
  •   scottd    16 年前

    是否在创建新模型后运行rake db:migrate和rake db:test:prepare?

        4
  •  0
  •   EmFi    16 年前

    所有表都需要一个ID列,这正是ActiveRecord的工作方式。正如MattmkNight指出的,您可以指定另一列作为主键。还可以通过提供 :id => false 作为创建表格的选项。

    Matt的答案包括重命名模型定义中的主键。下面介绍如何在迁移中执行此操作。

    注意,提供主键选项而不将id选项设为false意味着您不必将列的定义添加到块中。Rails会为您创建它。并自动在任何联接表中使用它。

    例子:

    class CreateTableWithOUtID < ActiveRecord::Migration
    
      def self.up
        create_table :my_new_table, :primary_key => :another_table_id do |t|
         t.string :some_other_column 
        end
      end
    
      def self.down
        drop_table, :my_new_table
      end
    end