如何在Rails 3中创建ActiveRecord无表格模型

时间:2012-02-03 04:55:40

标签: ruby-on-rails-3 activerecord model ruby-1.9.2

我正在尝试创建一个Active Record无表格模型。我的user.rb看起来像这样

class User < ActiveRecord::Base

  class_inheritable_accessor :columns

  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


  column :name, :text
  column :exception, :text
  serialize :exception      
end

在控制器中创建新对象时

@user = User.new

我收到错误

Mysql2 ::错误:表'Sampledb.users'不存在:SHOW FIELDS FROM users

7 个答案:

答案 0 :(得分:32)

class Tableless

  include ActiveModel::Validations
  include ActiveModel::Conversion
  extend ActiveModel::Naming

  def self.attr_accessor(*vars)
    @attributes ||= []
    @attributes.concat( vars )
    super
  end

 def self.attributes
   @attributes
 end

 def initialize(attributes={})
   attributes && attributes.each do |name, value|
     send("#{name}=", value) if respond_to? name.to_sym 
   end
 end

def persisted?
  false
end

def self.inspect
  "#<#{ self.to_s} #{ self.attributes.collect{ |e| ":#{ e }" }.join(', ') }>"
end

end

答案 1 :(得分:8)

少数事情:

首先,您正在使用Railscast 193中概述的Rails2方法,实际上您应该使用Railscast 219中概述的Rails 3方法

在执行此类操作时,您可能不希望从ActiveRecord :: Base继承。

在此阅读Yehuda Katz的blog post

答案 2 :(得分:1)

正如stephenmurdoch rails 3.0 + 中所提到的,您可以使用railscasts 219

中列出的方法

我不得不稍作修改才能让它发挥作用:

class Message
  include ActiveModel::Validations
  include ActiveModel::Conversion
  extend ActiveModel::Naming

  attr_accessor :name, :email, :content

  validates_presence_of :name
  validates_format_of :email, :with => /^[-a-z0-9_+\.]+\@([-a-z0-9]+\.)+[a-z0-9]{2,4}$/i
  validates_length_of :content, :maximum => 500

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

  def persisted?
    false
  end
end

答案 3 :(得分:0)

不要从ActiveRecord::Base继承你的班级 如果一个模型继承了ActiveRecord :: Base,就像你期望的模型类一样,那么它希望有一个数据库后端。

答案 4 :(得分:0)

只需删除:

class_inheritable_accessor :columns

它应该可以工作,即使关联就像带有表格的模型一样。

答案 5 :(得分:0)

只为那些仍在努力解决这个问题的人。对于rails 2.x.x

class TestImp < ActiveRecord::Base

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

对于rails 3.1.x,您可以包含ActiveModel(由@ducktyped解释)而不继承ActiveRecord,或者如果您确实需要从ActiveRecord :: Base继承,由于某种原因,那么上面还有另外一个:

class TestImp < ActiveRecord::Base

  def attributes_from_column_definition
    []
  end

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

答案 6 :(得分:0)

对于Rails&gt; = 3.2,有activerecord-tableless个宝石。它是创建无表格ActiveRecord模型的宝石,因此它支持验证,关联,类型。

当您在Rails 3.x中使用推荐的方法时,不支持关联或类型。