开发者

Ruby on Rails: Fully functional tableless model

开发者 https://www.devze.com 2023-02-10 06:02 出处:网络
After searching for a tableless model example I 开发者_如何学Pythoncame across this code which seems to be the general consensus on how to create one.

After searching for a tableless model example I 开发者_如何学Pythoncame across this code which seems to be the general consensus on how to create one.

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

However I would also like it to function, as a model does, representing a collection of object, so that I can do Item.all.

The plan is to populate Items with files and each Item's properties will be extracted from the files.

However currently if I do Item.all I get a

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

error.


I found an example at http://railscasts.com/episodes/219-active-model where I can use model features and then override static methods like all (should have thought of this before).

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


Or you could do it like this (Edge Rails only):

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

By simply including ActiveModel::Model you get all the other modules included for you. It makes for a cleaner and more explicit representation (as in this is an ActiveModel)

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号