ruby-on-rails-3 activerecord model ruby-1.9.2

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