列'id'不是primary_key,如何重置关系

时间:2011-05-06 10:12:13

标签: ruby-on-rails-3

我有第二个数据库的表格,它不是通过迁移

class Dzhfeed < Dzxdb

  set_table_name "pre_home_feed"

  set_primary_key :feedid

end

表:

CREATE TABLE pre_home_feed (
  feedid int(10) unsigned NOT NULL auto_increment ,
  appid smallint(6) unsigned NOT NULL default '0' ,
  icon varchar(30) NOT NULL default '' ',
  uid mediumint(8) unsigned NOT NULL default '0' ,
  username varchar(15) NOT NULL default '' ',
  dateline int(10) unsigned NOT NULL default '0' ,
  friend tinyint(1) NOT NULL default '0',
  hash_template varchar(32) NOT NULL default '' ,
  hash_data varchar(32) NOT NULL default '' ,
  title_template text NOT NULL,
  title_data text NOT NULL,
  body_template text NOT NULL ,
  body_data text NOT NULL,
  body_general text NOT NULL ,
  image_1 varchar(255) NOT NULL default '' ,
  image_1_link varchar(255) NOT NULL default '',
  image_2 varchar(255) NOT NULL default '' ,
  image_2_link varchar(255) NOT NULL default '' ,
  image_3 varchar(255) NOT NULL default '' ,
  image_3_link varchar(255) NOT NULL default '' ,
  image_4 varchar(255) NOT NULL default '' ,
  image_4_link varchar(255) NOT NULL default '' ,
  target_ids text NOT NULL ,
  id mediumint(8) unsigned NOT NULL default '0' ,
  idtype varchar(15) NOT NULL default '' ,
  hot mediumint(8) unsigned NOT NULL default '0' ,
  PRIMARY KEY  (feedid),
  KEY uid (uid,dateline),
  KEY dateline (dateline),
  KEY hot (hot),
  KEY id (id,idtype)
) ;

但是这个表有另一列名为'id'而不是primary_key

所以,当我想创建一个新的Dzhfeed时,我不知道如何设置名为id的列

我的代码是

feed = Dzhfeed.new(:appid => 0, :icon => 'doing', :uid => 1, :username => 'admin', :title_template => "xxxxxxxxxx", :body_template => '', :dateline => Time.now, :id => 0)

但它不起作用 错误是

Mysql::Error: Column 'id' cannot be null: INSERT INTO `pre_home_feed` (`image_3`, `uid`, `id`, `dateline`, `title_template`, `idtype`, `image_1`, `username`, `body_template`, `image_1_link`, `image_3_link`, `friend`, `title_data`, `appid`, `body_data`, `image_2_link`, `hot`, `image_4_link`, `image_4`, `hash_template`, `body_general`, `icon`, `target_ids`, `hash_data`, `image_2`) VALUES ('', 1, NULL, 1304675043, 'xxxxxxxxxx', '', '', 'admin', '', '', '', 0, '', 0, '', '', 0, '', '', '', '', 'doing', '', '', '')

1 个答案:

答案 0 :(得分:0)

你是如何创建表“pre_home_feed”的。如果是通过迁移,则默认情况下会添加id列并将其设置为主键。为了不添加“id”列,您必须在表定义迁移文件中说:id => false, :force => true并重新运行迁移。 (重新运行迁移首先需要回滚rake db:rollback。此命令将撤消上次迁移运行。)

您设置主键的方式非常好。你可以用这样的标准方式创建对象;

@feed = Dzhfeed.new( :feedid => :value .. )

我建议你浏览Rails Guides

<强>更新

链接到两个不同的数据库有点不同。基本上,您需要使用establish_connection中定义的ActiveRecord::Base方法来执行此操作:

establish_connection(
  :adapter  => "postgresql",
  :host     => "localhost",
  :username => "username",
  :password => "password",
  :database => "database_to_link_to"
)

<强>更新

根据this post here,您的问题应该使用composite_primary_keys gem来解决。

基本上你需要做的是:

安装gem composite_primary_keys,然后

require 'composite_primary_keys'
class Dzhfeed < Dzxdb
  set_primary_keys :feedif    
end

注意,它是set_primary_keys而不是set_primary_key。这应该可以解决你的问题。