2013-08-14 12 views
16

Vì vậy, tôi đang làm việc để di chuyển trang web php này bằng cơ sở dữ liệu hiện có mà tôi không thể thay đổi sang Rails. Có một bảng: Quotes với một cột có tên là type. Bất cứ khi nào tôi cố gắng và tạo ra một mô hình này và thiết lập các loại, nó nói với tôi những lỗi sau:Đường ray: Lỗi loại thừa kế một bảng không hợp lệ

ActiveRecord::SubclassNotFound (Invalid single-table inheritance type: HOME is not a subclass of Quotes)

Tôi không hiểu tại sao nó lại nghĩ kế thừa của nó bởi vì nó không được phép. Phương thức tạo của tôi trông giống như sau:

quote = Quotes.create(
    agent_id: agent.id, 
    client_id: client.id, 
    type: 'HOME', 
    status: 0, 
    date_created: DateTime.now 
) 

Nếu tôi nhận xét loại, mọi thứ hoạt động tốt. Nhưng với lỗi Type it.

Trả lời

49

Tôi đã giải quyết vấn đề này bằng cách đặt các mô hình inheritance_column thành không. Active Record Models thể kế thừa từ một bảng thông qua các thuộc tính :type, thiết lập inheritance_column để nil xóa bỏ rằng thuộc tính cho phép bạn có một cột cơ sở dữ liệu tên type

class Quote < ActiveRecord::Base 
    self.inheritance_column = nil 
end 
+0

Cảm ơn, điều này đã cho tôi đi đúng hướng. Tôi đã có một cột có tên là "loại" và nó đã gây ra lỗi. – mack

3

Tôi ghét phải gotchas tiềm năng sâu trong các mã đặc biệt là trong ban đầu các quy trình như tạo mô hình. Tốt hơn là chỉ cần thay đổi từ dành riêng cho một cái gì đó khác và giải phóng bản thân để tận dụng lợi thế của cột thừa kế sau này nếu nhu cầu xuất hiện. Một giải pháp sạch hơn được liệt kê ở đây ->rename a database column name using migration

Đọc;

  1. Thực hiện $> đường ray tạo di chuyển ChangeColumnName trong đó, ChangeColumnName là tên của di chuyển của chúng tôi. Đây có thể là bất kỳ tên nào.
  2. Bây giờ, chỉnh sửa các tập tin chuyển đổi tạo ra tại db/di chuyển/_change_column_name.rb

    class ChangeColumnName < ActiveRecord::Migration 
    def change 
    rename_column :table_name, :old_column, :new_column 
    end 
    end 
    
  3. $> rake db: di chuyển

Bạn sẽ phải chỉnh sửa bộ điều khiển và xem các tệp ví dụ nếu tên mô hình là sản phẩm sau đó bạn sẽ có khả năng chỉnh sửa các file

  1. /app/views/products/_form.html.erb
  2. /app/views/products/show.html.erb
  3. /app/controllers/products_controller.erb
  4. /app/views/products/index.html.erb
+0

Trong khi tôi đồng ý rằng đó là thực hành tốt nhất, vấn đề của tôi liên quan đến việc sử dụng Cơ sở dữ liệu cũ mà tôi không có khả năng thay đổi mọi thứ. –