4

私のアプリケーション構成には、AR 関係で使用する必要があるいくつかの値が含まれています。これが奇妙で犯罪につながる可能性があることは承知していますが、構成をテキストファイルとして維持する必要があり、正直なところ、テーブルレス モデルの良い例だと思います。残念ながら、AR (Rails 3.2) にテーブルを探さないように説得するのに苦労しています。私のテーブルレスモデル:

class Tableless < ActiveRecord::Base

  def self.table_name
      self.name.tableize
  end

  def self.columns
    @columns ||= [];
  end

  def self.column(name, sql_type = nil, default = nil, null = true)
    columns << ActiveRecord::ConnectionAdapters::Column.new(name.to_s, default, sql_type.to_s, null)
  end

  def self.columns_hash
    @columns_hash ||= Hash[columns.map { |column| [column.name, column] }]
  end

  def self.column_names
    @column_names ||= columns.map { |column| column.name }
  end

  def self.column_defaults
    @column_defaults ||= columns.map { |column| [column.name, nil] }.inject({}) { |m, e| m[e[0]] = e[1]; m }
  end

  def self.descends_from_active_record?
    return true
  end

  def persisted?
    return false
  end

  def save( opts = {} )
    options = { :validate => true }.merge(opts)
    options[:validate] ? valid? : true
  end
end

これは、実際のモデルによって拡張されます。

class Stuff < Tableless

  has_many :stuff_things
  has_many :things, :through => :stuff_things

  column :id, :integer
  column :name, :string
  column :value, :string

  def initialize(attributes = {})
    attributes.each do |name, value|
      send("#{name}=", value)
    end
  end
end

これはすべてSOおよびの場所で見つかったコードに基づいていますが、残念ながら、SQLException: no such table: stuffs: Any手がかりが得られますか?

4

2 に答える 2

3

Rails >= 3.2 には、activerecord-tableless gem があります。テーブルレス ActiveRecord モデルを作成するための gem であるため、検証、関連付け、型がサポートされています。

Rails 3.x で推奨される方法 (ActiveRecord ではなく ActiveModel を使用) を使用している場合、関連付けも型もサポートされていません。

于 2012-09-10T07:25:09.063 に答える
1

Rails >= 4 の場合、次のようにテーブルレス クラスを定義することで、検証、関連付け、および一部のコールバック (after_initialize など) のサポートも取得できます。

class Tableless < ActiveRecord::Base
    def self.columns() @columns ||= []; end

    def self.column(name, sql_type = nil, default = nil, null = true)
        columns << ActiveRecord::ConnectionAdapters::Column.new(name.to_s, default, sql_type.to_s, null)
    end 

    attr_accessor :id, :name, :value

    has_many :stuff_things
    has_many :things, :through => :stuff_things

end
于 2015-08-05T13:53:10.640 に答える