2011-02-14 4 views
4

테이블없는 모델 예제를 검색 한 후에이 코드를 작성한 후이를 작성하는 방법에 대한 일반적인 합의가 된 것 같습니다.Ruby on Rails : 완전 기능 테이블리스 모델

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...

오류가 발생합니다.

답변

7

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 
+0

그래, ActiveModel을 사용하십시오. – wuputah

+1

ActiveModel과 관계를 사용할 수 있습니까? has_one, has_many 등 .. AM으로 어떻게하는지 알 수 없습니다. – neonski

4

아니면 이런 식으로 할 수 있었다 (에지 레일 전용) :

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을 포함하여 :: 모델 당신은 다른 모든 모듈이 당신을 위해 포함 얻는다. 더 깨끗하고 명료하게 표현하기 (ActiveModel처럼)