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