当我删除帖子本身时,我想删除我为帖子创建的标记。但是如果令牌不存在,我不希望Rails抛出错误并停止执行。
现在,我就是这样做的。我觉得这段代码太粗糙了。有没有任何巧妙的方法来实现同样的目标?
DownloadToken.find_by_post_id(post.id).destroy unless DownloadToken.find_by_post_id(@post.id).nil?
答案 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_many
,has_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