ActiveRecord:如何获取可以批量分配的模型的所有属性?


75

我想要一个可以批量分配的所有属性名称的列表。对于自定义表单构建器,我需要此设置,该表单构建器默认不会添加无法批量分配的输入字段。

例如,如果我有以下模型:

class Post < ActiveRecord::Base
  attr_protected :account

  belongs_to :author

  validates_presence_of :title, :author
end

结果我希望有[:author, :title]

Answers:


99

如果您明确定义了attr_accessible,则Post.accessible_attributes会覆盖它

除非这样做,否则这样做很麻烦,但可以:

Post.new.attributes.keys - Post.protected_attributes.to_a

因此,如果accessible_attributes得到显式的attr_accessible'd,protected_attributes得到显式的attr_protect'd,有没有一种方法可以告诉您哪些是可访问的,而不管它们是通过attr_protected还是attr_accessible保护的?
克里斯·德拉皮

感谢您的发表。这是对我的过滤器属性方法的重要补充。
Kirk

4
有一个问题,这将把:created_at,:updated_at列为可访问的属性!!,它们不是
MhdSyrwan 2012年

3
@MhdSyrwan:您确定不是说:created_at和:updated_atSHOULDN'T可以访问而不是ARE NOT吗?如果您传递的名称为name =“ post [created_at]”且值为=“ 01/01/2012”的输入,则不会进入模型吗?在这里。取决于您的Rails版本(在Github / accessible properties丑闻之后,Rails核心将更改默认值)。
Breno Salgado 2013年

1
@BrenoSalgado:你是对的:),这取决于轨道版本 chrisroos.co.uk/blog/...
MhdSyrwan


25

只需使用

Post.accessible_attributes

这将返回该类的所有可访问属性


1
请注意,如果使用多个角色,你可以通过符号让你的不同的名单- Post.accessible_attributes(:user)Post.accessible_attributes(:admin)等我还发现Post.active_authorizers有用的,它返回所有定义的角色和他们的访问属性的哈希值。
Elliot Nelson 2013年

您正在使用哪个版本的红宝石?
安托万

1
使用Ruby 2.2.2; Rails 4.1.2:我有一个User由数据库表支持的模型。对于User.accessible_attributes,我得到NoMethodError: undefined method "accessible_attributes" for #<Class:0x007f9216346fe8>
sameers 2015年

我的rails版本4.2.6,但返回错误。但是@Scudelletti的答案有效。
企鹅

20

对于模型,您可以使用MyModel.attribute_namesMyModel.column_names

例如,您可以使用MyModel.new.attribute_names


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.