我有一个RoR应用程序,允许人们匿名发帖,因为他们会将他们的电子邮件地址放在一个字段中。
模型就是这样。
发布模型。
post.rb
belongs_to :user # optional: true --> this is for rails 5
用户模型
user.rb
has_many :posts
我的帖子模型包含以下列:title,body,user_email:string,user_id:integer
我的用户模型来自设计宝石。
在我的应用中,我让用户发帖而无需登录或不注册。这意味着他们可以创建帖子,而user_id列将为空(因为他们需要输入他们的电子邮件)。
但是,我想要实现的是,如果他们注册了我的应用程序,那么与他们注册的用户关联的所有帖子都应该将user_id列更改为其对应的user.id.所以在我的user.rb模型中,我添加了这段代码。
# user.rb
before_save :associate_post_to_user
def associate_post_to_user
Post.all.each do |post|
if post.user_email == self.email
post.user_id = self.id
end
end
end
但是,无论何时创建帐户,post中user_id的值都不会更改。我该如何实现这一目标?我正在使用设计宝石顺便说一句。提前谢谢!
答案 0 :(得分:2)
您的代码中有两个问题:
post.user_id = self.id
使用 Post.all ,SQL将查询所有帖子记录,会出现性能问题。
可能你可以这样改变它:
def associate_post_to_user
Post.where(user_email: self.email).update_all(user_id: self.id)
end
答案 1 :(得分:1)
由于为before_save
模型定义了User
挂钩,因此您需要明确save
您的Post
实例。
# user.rb
before_save :associate_post_to_user
def associate_post_to_user
Post.all.each do |post|
if post.user_email == self.email
post.user_id = self.id
post.save
end
end
end