2012-02-03 31 views
16

Tôi đang cố tạo Mô hình không hoạt động Bản ghi Hoạt động. user.rb của tôi trông như thế nàyCách tạo Mô hình không hoạt động ActiveRecord Kiểu trong Rails 3

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 

Khi tạo đối tượng mới trong điều khiển

@user = User.new

Tôi nhận được lỗi

Mysql2 :: Lỗi: Bảng 'Sampledb.users' không tồn tại: HIỂN THỊ FIELDS TỪ users

+1

Tại sao bạn cần Tableless mô hình. Bạn có thể chỉ đơn giản là có một lớp ruby ​​thay thế? Và nếu bạn cần chức năng cơ sở dữ liệu không và bằng cách sử dụng Rails3, bạn có thể thấy câu trả lời của tôi xuống. – ducktyped

Trả lời

8

Vài điều:

Trước hết bạn đang sử dụng cách tiếp cận Rails2 nêu trong Railscast 193 khi thực sự bạn nên sử dụng các Rails 3 cách tiếp cận, được nêu trong Railscast 219

Bạn có lẽ không muốn kế thừa từ ActiveRecord :: Base khi thực hiện việc này.

Đọc Yehuda Katz's blog post về điều này.

+0

+1 để giải thích rằng OP không muốn kế thừa từ ActiveRecord :: Base AND để hiển thị những gì cần làm thay cho Rails 3. Tôi chưa từng thấy bài đăng của Katz trước đó - nó có phần mở rộng hữu ích cho Railcast 219 của Ryan.Cảm ơn vì điều đó. –

32
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 
+1

Đây thực chất là những gì được viết trong http://railscasts.com/episodes/219-active-model?view=asciicast với một số chuông và còi bổ sung, nhưng chúng là chuông và còi đẹp. –

+0

Điều này thực sự tuyệt vời! cảm ơn bạn. – Derek

+1

Trong Rails 4 cũng có ActiveModel :: Model, bao gồm nhiều mô-đun ActiveModel và một số phép thuật khác, để làm cho bạn cảm thấy mô hình của bạn (không tồn tại hoặc được duy trì tùy chỉnh) như mô hình ActiveRecord. – nandinga

0

Không kế thừa lớp học của bạn từ ActiveRecord::Base.
Nếu một mô hình kế thừa từ ActiveRecord :: Base như bạn mong đợi một lớp mô hình, nó muốn có một cơ sở dữ liệu back-end.

0

Chỉ cần loại bỏ:

class_inheritable_accessor :columns 

Và nó cũng làm việc, ngay cả với các hiệp hội giống như một mô hình với một bảng.

0

Chỉ dành cho bất kỳ ai vẫn đang đấu tranh với điều này. Đối với đường ray 2.xx

class TestImp < ActiveRecord::Base 

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

Đối với đường ray 3.1.x bạn có thể bao gồm ActiveModel (như được giải thích bởi @ducktyped) mà không kế thừa từ ActiveRecord hoặc Nếu bạn cần phải kế thừa từ ActiveRecord :: Base do một số lý do sau đó ở trên với một bổ sung khác:

class TestImp < ActiveRecord::Base 

    def attributes_from_column_definition 
    [] 
    end 

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

Đối với Rails> = 3.2 có các activerecord-tableless đá quý. Một viên ngọc của nó để tạo ra các mô hình ActiveRecord không hoạt động, vì vậy nó có hỗ trợ cho các xác nhận hợp lệ, các kết hợp, các kiểu.

Khi bạn đang sử dụng cách được đề xuất để thực hiện trong Rails 3.x, không có hỗ trợ cho liên kết cũng như các loại.

1

Như đã đề cập bởi stephenmurdoch trong ray 3.0+ bạn có thể sử dụng phương pháp nêu trong railscasts 219

tôi đã phải làm một sửa đổi nhỏ để có được điều này để làm việc:

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 
Các vấn đề liên quan