0

我成功地按照这个迷你教程在我的表 (cars) 中有一个列 (car_code) 像一个序列一样工作(使用 postgreSQL 数据库)。

结果我有这张桌子:

CREATE TABLE Cars
(
 id serial NOT NULL,
 created_at timestamp without time zone NOT NULL,
 updated_at timestamp without time zone NOT NULL,
 car_date timestamp without time zone,
 car_code integer DEFAULT nextval('car_code_sequence'::regclass),
 CONSTRAINT cars_pkey PRIMARY KEY (id )
 )

我的插入语句工作正常:

INSERT INTO cars(created_at, updated_at, car_date) VALUES (now(), now(), now());
--1|Date|Date|Date|2 <--using my car_code_sequence

不幸的是,当我在“car_controller”中调用“创建”操作时,rails 应用程序会生成以下语句:

INSERT INTO "cars" ("created_at", "car_code", "car_date", "updated_at") 
VALUES ($1, $2, $3, $4) RETURNING "id" [
  ["created_at", Mon, 04 Mar 2013 14:39:55 UTC +00:00],
  ["car_code", nil], 
  ["car_date", Mon, 04 Mar 2013 14:39:55 UTC +00:00],
  ["updated_at", Mon, 04 Mar 2013 14:39:55 UTC +00:00]]

所以,我的问题是:

谁可以更改汽车模型以从插入语句中排除列“car_code”(但将“car_code”保留在数据库中),即具有与“id”相同的行为)。

4

1 回答 1

1

尝试在车型上添加此代码:

class Car < ActiveRecord::Base
  ## --------------------- Ignore columns patch ------
  @@ignore_column_pattern = /^car_code/

  class << self
    alias :all_columns :columns
    def columns 
      @columns_filt ||= all_columns.reject { |col| col.name =~ @@ignore_column_pattern } 
    end 
  end

  alias :all_attribute_names :attribute_names
  def attribute_names
    @attr_names_filt ||= all_attribute_names.reject { |att| att =~ @@ignore_column_pattern }
  end
  ## ------------------- / Ignore columns patch ------
end

来自:https ://stackoverflow.com/a/10319903/1042324

于 2013-03-04T17:38:25.390 回答