2012-04-26 39 views
21

Tôi đã sử dụng ActiveRecord::Base.set_table_name để đặt tên bảng của mình trên lớp ActiveRecord được tạo động. Bây giờ tôi cần phải biết làm thế nào để có được giá trị đó sau này. Các tài liệu api không đề cập đến bất cứ điều gì về cách làm điều này. Ngoài ra, tôi không thể lấy tên bảng ra khỏi tên lớp ActiveRecord vì chúng được khóa khác với tên bảng.Lấy tên bảng từ ActiveRecord

Dưới đây là một ví dụ tốt về những gì tôi đang làm

table_klass = Class.new(ActiveRecord::Base) 
    ActiveRecord::Base.const_set(const_name,table_klass) 
    app = @app 
    table_klass.class_eval do 
     after_save do 
     @@channel.push self 
     end 
     set_table_name t.server_table 
     establish_connection(
     :adapter => "mysql2", 
     :host  => app.db_host, 
     :username => app.db_user, 
     :password => app.db_pass, 
     :database => app.db_name 
    ) 
    end 

Trong trường hợp này, nếu const_name = Test và tên cơ sở dữ liệu Cơ sở dữ liệu là cần tạo ra một lớp của ActiveRecord :: Base :: DatabaseTest, mà nó làm. Nhưng khi tôi gọi table_name trên nó tôi nhận được biến địa phương hoặc phương pháp không xác định. Tôi có cần gọi tên nhóm trên lớp không?

Cập nhật: tôi nhận nó làm việc bằng cách gọi instance.class.table_name

Trả lời

30

Bạn đã thử table_name? Docs.

+0

Tôi đã cố gắng này, nó nói phương pháp xác định. Tôi nên rõ ràng hơn một chút. Tôi đang metaprogramming việc tạo ra lớp này. Tôi đang thêm một ví dụ rõ ràng hơn cho câu hỏi của tôi – MobileOverlord

+0

Ah, xin lỗi, tôi là một chút ra khỏi chiều sâu của tôi với nhiều meta. Tất cả những gì tôi có thể nói với bạn là 'table_name' là một phương thức lớp trên' ActiveRecord :: Base' (và do đó các lớp dẫn xuất của nó), thu được từ 'ActiveRecord :: ModelSchema :: ClassMethods'. – Chowlett

7
class User < ActiveRecord::Base 
end 

User.table_name 
# 'users' 
1

Tôi nghĩ rằng đó là cách thanh lịch hơn, nhưng các giải pháp đơn giản nhất là eval

my_class_name = "MyNewARClass" 
my_class_table_name = "MyDatabase" 
eval %{ 
    class #{my_class_name} < ActiveRecord::Base 
     self.table_name = "#{my_class_table_name}" 

    end 
    } 
9

muộn để đảng.

tôi đã sử dụng mã đường ray sau:

my_record = Record.id(0) # hypothetical code 
table_name = my_record.class.table_name 
+0

Muộn, nhưng nó đang hoạt động! –

+0

tại sao không chỉ 'Record.table_name' như các câu trả lời khác được đề xuất? : thumbdown: – akostadinov

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