Ruby on rails Rails:通过控制器更新已有的多条记录?

Ruby on rails Rails:通过控制器更新已有的多条记录?,ruby-on-rails,conditional,updates,has-many-through,Ruby On Rails,Conditional,Updates,Has Many Through,所以这三分之二是有效的。每次用户阅读一篇文章时,都会创建一个历史记录(有很多到),上面只写着“用户在阅读日期阅读文章” 数据库正常,模型正常,历史控制器中允许使用read_date参数,并且以下操作可以起作用:1)检查用户以前是否阅读过文章;2)如果这是本文的第一次,则创建新的历史记录 但我无法理解为什么中间位(只是更新现有记录上的读取日期)不起作用。如果我用h.save试试也没关系!或h.update() 如果发现现有记录,则抛出的错误为: undefined method `read_dat

所以这三分之二是有效的。每次用户阅读一篇文章时,都会创建一个历史记录(有很多到),上面只写着“用户在阅读日期阅读文章”

数据库正常,模型正常,历史控制器中允许使用read_date参数,并且以下操作可以起作用:1)检查用户以前是否阅读过文章;2)如果这是本文的第一次,则创建新的历史记录

但我无法理解为什么中间位(只是更新现有记录上的读取日期)不起作用。如果我用h.save试试也没关系!或h.update()

如果发现现有记录,则抛出的错误为:

undefined method `read_date=' for #<History::ActiveRecord_Relation:0x007fe7f30a5e50>
History.where(article\u id:@article,user\u id:current\u user)
正在返回一个
History::ActiveRecord\u关系。如果要设置读取日期,则需要获取一条记录

这里有一种方法可以利用您目前拥有的资源实现这一点:

h = History.where(article_id: @article, user_id: current_user).first
另一种处理方法是使用
find_by
而不是
where
。这将返回一条记录。像这样:

h = History.find_by(article_id: @article, user_id: current_user)
然而,如果一个用户有可能拥有一篇文章的许多历史记录,我会坚持你做事情的方式,做一个改变。如果出于某种原因,你有很多历史记录,这可能不是很有效

histories = History.where(article_id: @article, user_id: current_user)
histories.each { |history| history.update(read_date: Time.now) }
History.where(article\u id:@article,user\u id:current\u user)
正在返回一个
History::ActiveRecord\u关系。如果要设置读取日期,则需要获取一条记录

这里有一种方法可以利用您目前拥有的资源实现这一点:

h = History.where(article_id: @article, user_id: current_user).first
另一种处理方法是使用
find_by
而不是
where
。这将返回一条记录。像这样:

h = History.find_by(article_id: @article, user_id: current_user)
然而,如果一个用户有可能拥有一篇文章的许多历史记录,我会坚持你做事情的方式,做一个改变。如果出于某种原因,你有很多历史记录,这可能不是很有效

histories = History.where(article_id: @article, user_id: current_user)
histories.each { |history| history.update(read_date: Time.now) }

我意识到这个问题已经得到了回答。下面是一些额外的想法和建议

  • 我不会有一个单独的
    read\u date
    属性。只需在
处使用
updated\u即可。它已经为你准备好了。而且,代码的工作方式,
read\u date
updated\u at
将始终(基本上)相同

  • 查找历史记录是否存在时,可以执行
    当前用户.histories.where(article:@article)
    。依我看,这似乎比:
    History.where(article\u id:@article,user\u id:current\u user)更清晰。首先

  • 您只需检查
    h
    分配是否成功,就可以避免所有
    存在?
    存在?
    的业务。因此,
    如果h=current_user.histories.where(article:@article)

  • 如果您选择使用
    updated_at
    而不是
    read_date
    ,则可以将
    updated_at
    设置为
    时间。现在只需执行
    h.touch


  • 我会使用
    我意识到这个问题已经得到了回答。下面是一些额外的想法和建议

    • 我不会有一个单独的
      read\u date
      属性。只需在
    处使用
    updated\u即可。它已经为你准备好了。而且,代码的工作方式,
    read\u date
    updated\u at
    将始终(基本上)相同

  • 查找历史记录是否存在时,可以执行
    当前用户.histories.where(article:@article)
    。依我看,这似乎比:
    History.where(article\u id:@article,user\u id:current\u user)更清晰。首先

  • 您只需检查
    h
    分配是否成功,就可以避免所有
    存在?
    存在?
    的业务。因此,
    如果h=current_user.histories.where(article:@article)

  • 如果您选择使用
    updated_at
    而不是
    read_date
    ,则可以将
    updated_at
    设置为
    时间。现在只需执行
    h.touch


  • 我会用
    是的,就是这样,干得好,德里克。此外,不能对单个实例使用“exists”,但可以对关系数组使用。将发布工作版本。是的,就是这样,干得好,德里克。此外,不能对单个实例使用“exists”,但可以对关系数组使用。将发布工作版本。谢谢@jvillian,你太好了。已经找到了“触碰”并且摆脱了read_date,但不知道你可以使用Thanke@jvillian,你真是太好了。已经找到了“触摸”并删除了read_date,但不知道您可以使用
    
    current_user.histories.where(article: @article).tap do |h|
      h ? h.touch : current_user.articles << @article 
    end