ruby on rails 3 - Cómo crear un modelo sin tablas ActiveRecord en Rails 3
ruby-on-rails-3 ruby-1.9.2 (7)
Como lo mencionó stephenmurdoch
en rails 3.0+ , puede usar el método descrito en railscasts 219
Tuve que hacer una pequeña modificación para que esto funcione:
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
Estoy tratando de crear un modelo sin registro de Active Record. Mi user.rb se ve así
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
Al crear el nuevo objeto en el controlador
@user = User.new
Estoy recibiendo el error
Mysql2 :: Error: la tabla ''Sampledb.users'' no existe: MOSTRAR CAMPOS DE LOS users
No herede su clase de ActiveRecord::Base
.
Si un modelo se hereda de ActiveRecord :: Base como se esperaría que una clase de modelo, quiere tener una base de datos back-end.
Para Rails> = 3.2 existe la activerecord-tableless . Es una joya para crear modelos ActiveRecord sin tablas, por lo que tiene soporte para validaciones, asociaciones, tipos.
Cuando utiliza la forma recomendada de hacerlo en Rails 3.x, no hay soporte para tipos ni asociaciones.
Pocas cosas:
En primer lugar, está utilizando el enfoque Rails2 descrito en Railscast 193 cuando realmente debería usar el enfoque Rails 3, descrito en Railscast 219
Es probable que no desee heredar de ActiveRecord :: Base al hacer este tipo de cosas.
Lee la publicación del blog de Yehuda Katz sobre esto.
Sólo para cualquiera que todavía esté luchando con esto. Para rieles 2.xx
class TestImp < ActiveRecord::Base
def self.columns
@columns ||= []
end
end
Para los rieles 3.1.x puede incluir ActiveModel (como se explica por @ducktyped) sin heredar de ActiveRecord o si necesita heredar de ActiveRecord :: Base debido a alguna razón, entonces lo anterior con otra adición:
class TestImp < ActiveRecord::Base
def attributes_from_column_definition
[]
end
def self.columns
@columns ||= []
end
end
Solo remueve:
class_inheritable_accessor :columns
Y debería funcionar, incluso con asociaciones como un modelo con una tabla.
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