bre*_*ish 59 activerecord ruby-on-rails ruby-on-rails-3
我希望能够在数据库中创建一个记录,但后来阻止Rails从那一点开始进行更改.我知道在数据库级别仍然可以进行更改.
我相信attr_readonly在属性级别上做我想要的,但我不想手动指定字段...我宁愿有更多的白名单方法.
此外,我知道有一个:read_only选项用于关联,但我不想限制对象的"readonlyness",如果它是通过关联获取的.
最后,我希望能够仍然销毁一条记录,例如:dependent =>:destroy在关联中起作用.
因此,总结一下:1)允许创建记录,2)允许删除记录,3)防止更改已保留的记录.
scr*_*agz 76
看着ActiveRecord::Persistence,一切都最终create_or_update在幕后呼唤.
def create_or_update
raise ReadOnlyRecord if readonly?
result = new_record? ? create : update
result != false
end
Run Code Online (Sandbox Code Playgroud)
所以!只是:
def readonly?
!new_record?
end
Run Code Online (Sandbox Code Playgroud)
kwa*_*ick 49
我找到了一个更简洁的解决方案,它使用了after_initialize回调:
class Post < ActiveRecord::Base
after_initialize :readonly!
end
Run Code Online (Sandbox Code Playgroud)
Mik*_*wis 26
为什么不在具有只读访问权限的数据库上创建用户,并让rails使用该帐户.
但是,如果要进行模型级访问,可以将以下内容添加到特定模型:
def readonly?
true
end
def before_destroy
raise ActiveRecord::ReadOnlyRecord
end
Run Code Online (Sandbox Code Playgroud)
apn*_*ing 16
此博客文章仍然有效:http://ariejan.net/2008/08/17/activerecord-read-only-models/
基本上,如果添加方法,您可以依赖ActiveRecord的验证:
def readonly?
true
end
Run Code Online (Sandbox Code Playgroud)
小智 5
class YourModel < ActiveRecord::Base
before_save { false } # prevent create & update, allows destroy
# ...
end
Run Code Online (Sandbox Code Playgroud)
before_create { false } before_update { false }before_destroy { false } # does not prevent delete另请参阅:http : //guides.rubyonrails.org/active_record_callbacks.html