Бестабличные модели в рельсах 3.1 - PullRequest
7 голосов
/ 01 сентября 2011

Похоже, этот метод больше не работает в рельсах 3.1.Итак, у кого-нибудь есть рабочее решение?

На самом деле, я нашел это gist .Он решает проблемы с ошибками columns_hash и column_defaults из решения Railscast, но я постоянно получаю ошибку ActiveRecord::ConnectionNotEstablished, когда пытаюсь написать какой-либо атрибут.

Есть мысли?

Ответы [ 6 ]

13 голосов
/ 19 октября 2011

Простейшая безбланковая модель в Rails 3.1:

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

  attr_accessor :email, :password
  validates :email, :presence => true
  validates :password, :presence => true

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

  def persisted?
    false
  end
end

ActiveModel :: Validations не является обязательным (только если используются проверки).Кроме того, конструктор не требуется (но очень желательно).

9 голосов
/ 11 сентября 2016

Для Rails / ActiveRecord 5.0 вам нужно переопределить private def self.load_schema!, чтобы избежать проверки table_name.Также обратите внимание на небольшой взлом метода column (Type).

Вот полный список для модели Tableless для Rails 5.0 / ActiveRecord 5.0

class Tableless < ActiveRecord::Base

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

  def self.column(name, sql_type = nil, default = nil, null = true)
    type = "ActiveRecord::Type::#{sql_type.to_s.camelize}".constantize.new
    columns << ActiveRecord::ConnectionAdapters::Column.new(name.to_s, default, type, 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

  # Override the save method to prevent exceptions.
  def save(validate = true)
    validate ? valid? : true
  end

  private

  def self.load_schema!
    columns_hash.each do |name, column|
      self.define_attribute(
        name,
        column.sql_type_metadata,
        default: column.default,
        user_provided_default: false
      )
    end
  end

end
7 голосов
/ 04 сентября 2011

Эта вещь без таблиц кажется все более и более хакерской, но микс просто не то же самое (не помню точно, что не сработало сейчас, я имел дело с этим несколько месяцев назад, вернулся кэто потому что обновление до 3.1 сломало его).Версия 3.1.0rc4 работала с переопределением метода columns_hash, 3.1.0 также требует переопределения column_defaults.Итак, вот версия, которая проходит мои тесты проекта.

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

  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

  # Override the save method to prevent exceptions.
  def save(validate = true)
    validate ? valid? : true
  end
end

Надеюсь, это работает для вас,

- Хосе

6 голосов
/ 02 сентября 2011

Вы должны создать свой собственный класс модели и смешать нужные вам части ActiveModel (например, валидации). Этот пост в блоге Иегуды Каца содержит подробности.

1 голос
/ 07 сентября 2012

Для Rails 3.2 существует activerecord-tableless gem.Это жемчужина для создания бесстабильных моделей ActiveRecord, поэтому он поддерживает валидации, ассоциации, типы.

Когда вы используете рекомендуемый способ сделать это в Rails 3.x, не поддерживается ни ассоциация, ни типы.

0 голосов
/ 10 сентября 2012

и для Rails 3.2 версия RUBY должна быть предпочтительнее 1.9.3 во избежание несовместимости.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...