2017-08-01 132 views
0

我有一个RoR应用程序,它允许人们匿名发布,因为他们会将他们的电子邮件地址放在一个字段中。Ruby on Rails:从另一个模型迭代模型值before_create/before_save

模型是这样的。

邮政模型。

post.rb 
    belongs_to :user # optional: true --> this is for rails 5 

用户模型

user.rb 
    has_many :posts 

我的岗位模型具有这些列:标题,正文,USER_EMAIL:字符串,USER_ID:整数

我的用户模型从色器件宝石来。

在我的应用程序中,我让用户发帖而不登录或不登录。这意味着他们可以创建帖子,并且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的值都不会更改。我如何实现这一目标?我正在使用设计宝石顺便说一句。提前致谢!在你的代码

回答

2

两个问题:

  1. 没有post.savepost.user_id = self.id

  2. 使用Post.all,则SQL会查询所有Post邮件记录,会出现性能问题。

可能是你可以改变它是这样的:

def associate_post_to_user 
     Post.where(user_email: self.email).update_all(user_id: self.id) 
    end 
+0

感谢您的支持!这真的很有帮助。我不知道有一个名为update_all的助手。顺便说一句,你怎么知道这些帮手?有没有一本教导所有这些的特定书? – Lorelyn

+0

经常阅读rails api,它会帮助你更多。参考是https://apidock.com/rails/v4.0.2/ActiveRecord/Relation/update_all – xiaocui

1

由于before_save挂钩您User模型定义的,你需要明确savePost实例。

# 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 
+0

谢谢!我虽然这样做post.save将是多余的,因为模型目前还没有保存(这就是before_save的原因)。现在我知道这不是谢谢! – Lorelyn