2012-03-02 38 views
6

Tôi đang xây dựng ứng dụng đường ray quanh một số cơ sở dữ liệu hiện có, tên cột được sử dụng trong cơ sở dữ liệu hiện tại không hoạt động tốt với quy ước liên kết đường ray. Có cách nào để thiết lập bí danh tên cột trong một mô hình tương tự như cách bạn có thểĐặt tên cột theo cách thủ công trong mô hình đường ray

class User < Activerecord::Base 
self.set_table_name "users" 
end 

Tôi có thể đặt tên bí danh cột khi cột db hiện tại sẽ không làm việc với hiệp hội đường ray mặc định quy ước đặt tên?

Trả lời

13

Trong mô hình của bạn, chỉ cần thiết lập bí danh cho thuộc tính (cột). Ví dụ:

class User < Activerecord::Base 
    alias_attribute :new_column_name, :real_column_name 
end 
+0

Chính xác những gì tôi cần cảm ơn. – holaSenor

+0

Tôi cũng tìm thấy blog này với một số gợi ý khác liên quan đến chủ đề này.http: //nasir.wordpress.com/2007/10/24/not-following-rails-table-and-field-conventions/ – holaSenor

+1

Lưu ý công cụ tìm năng động sẽ không hoạt động. Một test nhanh: 'alias_attribute: kiểm tra,: username' '=> 32' ' User.find_by_test ('Abc') id' 'User.find_by_username ('Abc') id'.. 'NoMethodError: phương thức undefined 'find_by_test' cho # ' – Zheileman

2

Nếu bạn có thể sửa đổi cột cơ sở dữ liệu (tức là chỉ ứng dụng đường ray của bạn tham chiếu) bạn có thể viết di chuyển bằng cách sử dụng phương thức rename_column. Bởi vì bạn đang sử dụng đường ray 3 bạn chỉ có thể sử dụng lệnh sau

~: rails g migration RenameColumnNameToNewColumn columnName:columnType

Rõ ràng thay thế việc đặt tên chung chung với những gì tốt nhất cho bạn. Điều này sẽ tạo ra một sự chuyển đổi cho bạn trông giống như thế này, và nếu không, sửa đổi nó để trông giống như mã dưới đây

class ChangeOldColumnToNewColumn < ActiveRecord::Migration 
     def up 
      rename_column :tableName, :oldColumn, :newColumn 
     end 

     def down 
      rename_column :tableName, :newColumn, :oldColumn 
     end 
end 

Nếu bạn là không thể thay đổi tên cột trong bảng thực tế bạn có thể đặt một dòng tương tự với điều này trong mô hình của bạn mà nên đạt được những gì bạn đang cố gắng làm.

alias_attribute :newColumnName, :existingColumnName 

Bạn có thể cần đặt tên hiện tạiColumnName trong dấu ngoặc kép nếu tên cột là đường dẫn khó hiểu.

+0

Tôi sẽ thử điều này, nhưng Zheilman có một điểm tìm thấy sẽ không hoạt động, điều này có thể gây nhầm lẫn. Tôi chỉ có thể ETL dữ liệu tôi cần vào một cơ sở dữ liệu đường ray mới và sử dụng setup_connection để kết nối. – holaSenor

+0

Đó là một điểm thú vị mà anh ấy đã nêu lên, tôi rất muốn nghe điều này kết thúc như thế nào cho bạn. – coderates

+1

Nếu bạn có thể đổi tên các cột đó, đó chắc chắn là cách để đi, vì Rails sẽ không chơi tốt trong các quy ước, và bạn sẽ phải "lừa" quá nhiều thứ trong thời gian dài. Tất cả phụ thuộc vào mức độ kiểm soát của bạn trong lược đồ cơ sở dữ liệu và có bao nhiêu "cột sai" (có thể chỉ 1 hoặc 2 bạn có thể đi theo cách khôn lanh). – Zheileman

Các vấn đề liên quan