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ステートメントはうまくいきます:

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 に答える