如何迭代ActiveModel中的所有“表列”?

时间:2011-11-18 17:37:05

标签: ruby-on-rails-3 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

2 个答案:

答案 0 :(得分: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 :(得分:1)

假设您的模型继承自ActiveRecord,您可以在模型的类上调用column_namescolumns也可以使用。

请注意,这些是类方法。如果出于某种原因,您不想直接使用类名,则可以执行obj.class.columns_hash之类的操作。