Ruby on Rails:从另一个模型before_create / before_save中迭代模型值

时间:2017-08-01 01:30:06

标签: ruby-on-rails ruby ruby-on-rails-4 devise ruby-on-rails-5

我有一个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的值都不会更改。我该如何实现这一目标?我正在使用设计宝石顺便说一句。提前谢谢!

2 个答案:

答案 0 :(得分:2)

您的代码中有两个问题:

  1. post.user_id = self.id

  2. 之后没有 post.save
  3. 使用 Post.all ,SQL将查询所有帖子记录,会出现性能问题。

  4. 可能你可以这样改变它:

        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