我想迭代表中的所有列以获取模型并对其执行一些逻辑。
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
。
答案 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_names
。 3}}或columns
也可以使用。
请注意,这些是类方法。如果出于某种原因,您不想直接使用类名,则可以执行obj.class.columns_hash
之类的操作。