小编Rob*_*Rob的帖子

如何在创建新用户时为paper_trail设置whodunnit?

paper_trail gem跟踪版本,并且做得很好.但是,我注意到有一个边缘情况.对于大多数对象,应用程序控制器会在您登录时设置whodunnit,然后在该会话期间创建的所有对象都具有根据登录者记录"whodunnit"的版本.

有趣的情况是没有人登录,因为新用户正在注册.用户使用"nil"whodunnit创建,这是错误的,因为实际上用户是由他们自己创建的.

当然,在保存用户记录之前,whodunnit无法知道用户的id.我知道这个.

但是,这会在以后产生冲突,因为各种批处理作业也会修改用户记录,而不是在Web会话中,也会创建具有nil whodunnit记录的版本.

现在我无法分辨谁创建了用户 - 某些批量导入过程或用户.

我正在考虑各种解决方案,比如可能围绕Papertrail :: Versions表搜索该对象并修复whodunnit,但这看起来非常不洁净.

有什么建议?

ruby-on-rails paper-trail-gem

7
推荐指数
1
解决办法
2430
查看次数

Rails协会:自动保存似乎没有按预期工作

我在这里做了一个真实的基本github项目演示这个问题。基本上,当我创建新评论时,它会按预期保存;更新现有评论时,不会保存它。但是,这并不是文档:autosave => true所说的……他们说的恰恰相反。这是代码:

class Post < ActiveRecord::Base
  has_many :comments, 
           :autosave => true, 
           :inverse_of => :post,
           :dependent => :destroy

  def comment=(val)
    obj=comments.find_or_initialize_by(:posted_at=>Date.today)
    obj.text=val
  end
end

class Comment < ActiveRecord::Base
  belongs_to :post, :inverse_of=>:comments
end
Run Code Online (Sandbox Code Playgroud)

现在在控制台中,我测试:

p=Post.create(:name=>'How to groom your unicorn')
p.comment="That's cool!"
p.save!
p.comments # returns value as expected. Now we try the update case ... 

p.comment="But how to you polish the rainbow?"
p.save!
p.comments # oops ... it wasn't updated
Run Code Online (Sandbox Code Playgroud)

为什么不?我想念什么?

请注意,如果您不使用“ find_or_initialize”,则它会因为ActiveRecord尊重关联缓存而起作用-否则,它会过于频繁地重新加载注释,从而导致更改。即,此实现有效

def comment=(val) …
Run Code Online (Sandbox Code Playgroud)

ruby activerecord ruby-on-rails associations ruby-on-rails-4

5
推荐指数
1
解决办法
771
查看次数