如果仅在Rails中存在记录,如何删除记录?

时间:2015-01-20 06:55:31

标签: mysql ruby-on-rails activerecord

当我删除帖子本身时,我想删除我为帖子创建的标记。但是如果令牌不存在,我不希望Rails抛出错误并停止执行。

现在,我就是这样做的。我觉得这段代码太粗糙了。有没有任何巧妙的方法来实现同样的目标?

DownloadToken.find_by_post_id(post.id).destroy unless DownloadToken.find_by_post_id(@post.id).nil?

4 个答案:

答案 0 :(得分:7)

这是一种方式

DownloadToken.find_by_post_id(post.id).try(:destroy)

rails的更新语法:

DownloadToken.find_by(id: post.id).try(:destroy)

使用Ruby的安全导航操作员:

DownloadToken.find_by(id: post.id)&.destroy

答案 1 :(得分:1)

看看你的Post模型; post.rb

IE中。

Class Post < ActiveRecord::Base
  has_many :download_tokens, dependent: :destroy
end

现在删除Post对象时,无论关联如何; has_manyhas_one,它也会找到dependent。在这种情况下,DownloadToken(s)

答案 2 :(得分:1)

如果您确定要使用post方法处理destroy删除,则可以按照Jay's answer进行删除,这样就可以了。

如果您要在delete上使用post方法,则需要一些额外的功能来处理download_tokens

class DownloadToken < ActiveRecord::Base
  def self.remove_post_tokens(the_post_id)
    where(post_id: the_post_id).destroy_all
  end
end

所以你的序列将是:

id = post.id
post.delete #or post.destroy
DownloadToken.remove_post_tokens(id)

这种情况不仅仅是学术性的,因为依赖性破坏行为可能非常昂贵,例如,如果你有太多的download_tokens,那么你就不希望它与post的破坏处于同一个事务中。

答案 3 :(得分:0)

DownloadToken.find_by_post_id(post.id)&.destroy

仅当查询结果不是destroy时才执行nil。它是以下内容的缩写版本:

token = DownloadToken.find_by_post_id(post.id)
token.destroy if token