Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails RubyonRails:在创建/保存之前迭代来自另一个模型的模型值_Ruby On Rails_Ruby_Ruby On Rails 4_Devise_Ruby On Rails 5 - Fatal编程技术网

Ruby on rails RubyonRails:在创建/保存之前迭代来自另一个模型的模型值

Ruby on rails RubyonRails:在创建/保存之前迭代来自另一个模型的模型值,ruby-on-rails,ruby,ruby-on-rails-4,devise,ruby-on-rails-5,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 我的帖子模型有以下列:标题、正文、用户\电子邮件:字符串、用户\ id:整数 我的用户模型来自Desive gem 在我的应用程序中,我允许用户在不登录或不注册的情况下发布。这意味着

我有一个RoR应用程序,允许人们匿名发布,因为他们会将自己的电子邮件地址放在一个字段中

模型是这样的

后模型

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

user.rb
  has_many :posts
我的帖子模型有以下列:标题、正文、用户\电子邮件:字符串、用户\ id:整数

我的用户模型来自Desive gem

在我的应用程序中,我允许用户在不登录或不注册的情况下发布。这意味着他们可以创建帖子,用户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中用户id的值都不会更改。我如何做到这一点?我正在使用设计宝石顺便说一句。提前谢谢

您的代码中有两个问题:

  • post.user\u id=self.id之后没有post.save

  • 使用Post.all,SQL将查询所有Post记录,将出现性能问题

  • 也许你可以这样改变它:

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

    您的代码中有两个问题:

  • post.user\u id=self.id之后没有post.save

  • 使用Post.all,SQL将查询所有Post记录,将出现性能问题

  • 也许你可以这样改变它:

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

    由于在为
    用户
    模型定义
    钩子之前,您需要
    保存
    您的
    发布
    实例

    # 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
    

    由于在为
    用户
    模型定义
    钩子之前,您需要
    保存
    您的
    发布
    实例

    # 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
    

    谢谢你!这真的很有帮助。我不知道有一个叫update\u all的助手。顺便问一下,你是怎么认识这些助手的?有没有一本专门的书教你所有这些内容?经常阅读rails api,它会对你有更多帮助。谢谢你的参考!这真的很有帮助。我不知道有一个叫update\u all的助手。顺便问一下,你是怎么认识这些助手的?有没有一本专门的书教你所有这些内容?经常阅读rails api,它会对你有更多帮助。参考资料是谢谢你!我认为做post.save是多余的,因为模型目前还没有保存(这就是为什么在保存之前)。现在我知道不是了,谢谢!非常感谢。我认为做post.save是多余的,因为模型目前还没有保存(这就是为什么在保存之前)。现在我知道不是了,谢谢!