Ruby on Rails: полностью функциональная модель без таблиц - PullRequest
4 голосов
/ 15 февраля 2011

После поиска примера модели без таблиц я наткнулся на этот код, который, как представляется, является общим консенсусом о том, как его создать.

class Item < ActiveRecord::Base
class_inheritable_accessor :columns
  self.columns = []

  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 all
    return []
  end

  column :recommendable_type, :string
  #Other columns, validations and relations etc...
end

Однако я также хотел бы, чтобы он функционировал, как модель делает, представляющий коллекцию объектов, так что я могу сделать Item.all.

План состоит в том, чтобы заполнить Предметы файлами, и свойства каждого Предмета будут извлечены из файлов.

Однако в настоящее время, еслиЯ делаю Item.all я получаю

Mysql2::Error Table 'test_dev.items' doesn't exist...

ошибка.

Ответы [ 2 ]

7 голосов
/ 15 февраля 2011

Я нашел пример на http://railscasts.com/episodes/219-active-model, где я могу использовать функции модели, а затем переопределить статические методы, как и все (следовало подумать об этом раньше).

class Item
  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

  class << self
    def all
      return []
    end
  end

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

  def persisted?
    false
  end
end
4 голосов
/ 26 июня 2012

Или вы можете сделать это так (только Edge Rails):

class Item
  include ActiveModel::Model

  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
end

Просто включив ActiveModel :: Model, вы получите все остальные модули, включенные для вас. Это делает для более чистого и более явного представления (как в этом ActiveModel)

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