我有一个grails工作正在对我的数据进行一些处理。这涉及在一些字符串操作之后更新标题字段。
我试图让lastUpdated标记不受上述过程的影响,因为用户通常会按lastUpdated排序。
有没有办法暂时禁用autoTimestamp?我使用的是grails 2.4.5。
我已尝试过这个建议,但没有奏效,也大大减慢了处理速度(4秒转为30秒)
def toggleAutoTimestamp(target, enabled) {
def applicationContext = (ServletContextHolder.getServletContext()
.getAttribute(ApplicationAttributes.APPLICATION_CONTEXT))
def closureInterceptor = applicationContext.getBean("eventTriggeringInterceptor")
def datastore = closureInterceptor.datastores.values().iterator().next()
def interceptor = datastore.getEventTriggeringInterceptor()
def listener = interceptor.findEventListener(target)
listener.shouldTimestamp = enabled
null
}
**更新** 此外,我不是在寻找涉及创建仅在特定场景(atm)上更新的新字段的解决方案。
答案 0 :(得分:3)
负责根据LoadModule passenger_module /usr/local/lib/ruby/gems/2.1/gems/passenger-5.0.18/buildout/apache2/mod_passenger.so
LoadModule fastcgi_module libexec/apache24/mod_fastcgi.so
<IfModule mod_passenger.c>
PassengerRoot /usr/local/lib/ruby/gems/2.1/gems/passenger-5.0.18
PassengerDefaultRuby /usr/local/bin/ruby21
</IfModule>
# Virtual hosts
<VirtualHost *:80>
ServerName www.mydomain.com
DocumentRoot /usr/home/myusername/websites/myrailsappname/public
<Directory /usr/home/myusername/websites/myrailsappname/public>
AllowOverride all
Options -MultiViews
Order allow,deny
Allow from all
</Directory>
</VirtualHost>
Include etc/apache24/Includes/*.conf
映射设置设置时间戳的类是org.grails.orm.hibernate.support.ClosureEventListener。
我尝试使用Groovy类别和拦截器拦截对 handleTimestampingBeforeUpdate 的调用:既没有奏效。我怀疑 ClosureEventListener 是在另一个线程中运行的。我没有尝试使用 ExpandoMetaClass ,因为这会导致全局更改,影响autoTimestamp
的所有尝试。
我认为最好的选择是:
save()
之前禁用该标记。另一种方法是实现执行此操作的自定义save()
方法。此方法需要关闭autoTimestamp,因为 ClosureEventListener 在调用 save()
后设置时间戳。因此,如果未关闭autoTimestamp,则会覆盖beforeUpdate()中对lastUpdated的更改。
答案 1 :(得分:0)
有一个名为autoTimeflag的标志
使用示例:
i-th