Wal*_*nes 6 ruby activerecord ruby-on-rails
我到处寻找一个优雅的解决方案.基本问题似乎是,在ActiveRecord :: Base中,映射到数据库列的ActiveRecord属性与attr_accessor方法完全不同.
我想做的事情如下:
model.attribute_names.each do |name|
# do stuff
end
Run Code Online (Sandbox Code Playgroud)
以包含attr_accessor字段的方式,但不包括任何其他实例方法.我知道这不是内置的,但最优雅的方法是什么?
你无法解决这个问题.你可以近似一个黑客,但它不会很好地工作.
model.attribute_names应该得到你所有的ActiveRecord,但attr_accessor字段不是字段.它们只是普通的ruby方法,而获取它们的唯一方法就是使用它model.instance_methods.
你可以这样做model.attribute_names + model.instance_methods,但是你必须过滤掉所有其他正常的ruby方法initialize, save,这些都是不切实际的.
为了帮助过滤instance_methods你可以匹配它们model.instance_variables(你必须@手动考虑实例变量中的符号),但问题是实例变量在第一次分配之前根本不存在.
在你environment.rb之前,什么都曾经被加载时,定义自己self.attr_accessor在ActiveRecord::Base.然后,这可以包装底层,attr_accessor但也将属性名称保存到私有列表.然后你就可以在以后退出这个列表了.但是我建议不要这样做......猴子修补核心语言设施就像attr_accessor保证给你带来很多痛苦.
定义您自己的custom_attr_accessorin ActiveRecord::Base,它与Idea 2完全相同,并在您希望能够检索属性名称的代码中使用它.这将是安全的,因为您不再破坏内置attr_accessor方法,但您必须更改所有代码以custom_attr_accessor在必要时使用
总的来说,你想要做什么,需要了解所有attr_accessor领域?如果可以的话,尝试从不同的角度看问题.
| 归档时间: |
|
| 查看次数: |
11903 次 |
| 最近记录: |