2009-05-05 32 views
317

Làm cách nào để lấy tên lớp từ đối tượng ActiveRecord?Làm thế nào để có được tên của một lớp Ruby?

tôi có:

result = User.find(1) 

tôi đã cố gắng:

result.class 
# => User(id: integer, name: string ...) 
result.to_s 
# => #<User:0x3d07cdc>" 

tôi cần chỉ tên lớp, trong một chuỗi (User trong trường hợp này). Có phương pháp nào cho điều đó không?

Tôi biết điều này khá cơ bản, nhưng tôi đã tìm kiếm cả tài liệu của Rails và Ruby, và tôi không thể tìm thấy nó.

+1

@Oliver N .: Với đối tượng của Ruby bình thường, 'Object # class.inspect' cho giống như' Object # class.name', trong khi đây không phải là trường hợp với các đối tượng ActiveRecord. –

Trả lời

604

Bạn muốn gọi .name trên lớp của đối tượng:

result.class.name 
+3

Khi tôi làm điều này tôi nhận được các tên mô-đun trước nó, vì vậy "Module :: SubModule :: Class", là có một cách để nhận được chỉ "Class" –

+22

@Abe: 'result.class.name.split (':: ') .last' –

+72

@Abe: thậm chí sạch hơn (ActiveSupport): 'result.class.name.demodulize' – pseidemann

31

Cả result.class.to_sresult.class.name làm việc.

+28

Nhưng khái niệm, #name trả về tên, #to_s trả về một biểu diễn chuỗi, chỉ xảy ra trùng với tên. Tôi muốn sử dụng #name, chỉ cần thoát khỏi hậu môn. – kch

87

Đây là câu trả lời đúng, được trích xuất từ ​​các bình luận của Daniel Rikowski và pseidemann. Tôi mệt mỏi vì phải loại trừ thông qua ý kiến ​​để tìm ra câu trả lời đúng ...

Nếu bạn sử dụng Rails (ActiveSupport):

result.class.name.demodulize 

Nếu bạn sử dụng POR (plain-ol-Ruby):

result.class.name.split('::').last 
0

Trong trường hợp của tôi khi tôi sử dụng một cái gì đó như result.class.name Tôi có một cái gì đó như Module1::class_name. Nhưng nếu chúng ta chỉ muốn class_name, sử dụng

result.table_name.singularize

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