2011-11-18 67 views
1

我想遍歷模型的表中的所有列並對其執行一些邏輯。如何迭代ActiveModel中的所有「表列」?

def fetch_all_fields 
    @profile_page ||= profile_page 
    SOMETHING.each do |field_name| 
     method_name = "remote_#{field_name}" 
     if self.respond_to?(method_name, true) 
     field_values[field_name] = send(method_name) 
     end 
    end 
    field_values 
    end 

基本上,在我的模型一個簡單的循環,讓我來定義像remote_date_of_birth方法。然後這個方法包含正確的邏輯和信息來解析來自某個遠程數據集的date_of_birth(它實際上是HTML)。

我無法找到的部分是如何獲取此模型表的「列」。說一個表profiles,在上面的例子中,有一列date_of_birth

回答

4

最明顯的方法是使用columns方法,例如:

> User.columns.each { |c| puts "#{c.name} - #{c.sql_type} - #{c.type}" } 
id - INTEGER - integer 
email - varchar(255) - string 
crypted_password - varchar(255) - string 
password_salt - varchar(255) - string 
persistence_token - varchar(255) - string 
login_count - integer - integer 
failed_login_count - integer - integer 
last_request_at - datetime - datetime 
current_login_at - datetime - datetime 
last_login_at - datetime - datetime 
current_login_ip - varchar(255) - string 
last_login_ip - varchar(255) - string 
created_at - datetime - datetime 
updated_at - datetime - datetime 
nickname - varchar(255) - string 
first_name - varchar(255) - string 
last_name - varchar(255) - string 

如果你需要他們在任意的,非有序,散列是比較合適的。

這不包括關聯,它可以通過reflections方法找到。

1

假設你的模型繼承自ActiveRecord,你可以在模型的類上調用column_names。也可以使用columnscolumns_hash

請注意,這些是類方法。如果出於某種原因,您不想直接使用類名稱,則可以執行類似obj.class.columns_hash的操作。