我正在尝试创建一个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
答案 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中使用推荐的方法时,不支持关联或类型。