在ActiveRecord中使用id作为普通列

时间:2011-06-29 23:53:17

标签: ruby activerecord

所以基本上我有两个问题。

首先,我想使用名为“article_id”的列作为我的文章表的主键。它在我的数据库中设置为auto_increment主键。

其次,我还需要使用名为“id”的列作为标准列。

现在发生的事情是,当我为“id”分配一个值时,“article_id”也会被填充相同的值。理想情况下,“article_id”应保持为空,以便在插入记录时,会给出生成的auto_increment值。我还应该注意,我需要使用名为“type”的列,这就是为什么我覆盖了inheritance_column。

这是我目前的模特

class Article < ActiveRecord::Base
  attr_reader :id
  attr_reader :type

  set_primary_key :article_id

  set_inheritance_column do
    'active_record_type'
  end

  def id=(id)
    @id = id
  end
end

它正在填充以下代码

article = Article.new
article.type = 123
article.name = 'Foo Bar'
article.id   = 456
article.save

所以基本上我怎么能得到上面的代码来生成一个看起来像

的查询
INSERT INTO `articles` (`type`, `name`, `id`) VALUES(123, 'Foo Bar', 456)

但目前它正在生成一个类似于

的查询
INSERT INTO `articles` (`type`, `name`, `id`, `article_id`) VALUES(123, 'Foo Bar', 456, 456)

1 个答案:

答案 0 :(得分:1)

怎么样:

class Article < ActiveRecord::Base
  set_primary_key :article_id

  def id
    self.read_attribute(:id)
  end

  def id=(id)
    self.write_attribute(:id, id)
  end
end

>> a = Article.new
>> a.id = 111
>> a.name = "First"
>> a.save
  Article Create (0.6ms)   INSERT INTO "articles" ("name", "id") VALUES('First', 111)
>> Article.all
=> [#<Article article_id: 5, id: 111, name: "First">]
>> Article.first.id
=> 111
>> Article.first.article_id
=> 5