对Song的无范围调用#find

时间:2018-12-01 16:02:41

标签: ruby-on-rails-5

我最近将我的项目添加到了Codacy,并且在以下代码行中也出现了错误(也在另一个区域中,但这对我来说似乎是最简单的理解):

def new
  @arrangement = Arrangement.new
  @arrangement.song_id = params[:song_id]
  @song = Song.find(params[:song_id]) # This is the offending line
  authorize @arrangement
end

一首乐曲可以有一个或多个编曲,并且song_id作为参数之一传递到控制器。项目ERD为:Project ERD

Codacy说

  

无范围查找(和相关方法)是直接对象引用的一种形式。通常应通过范围查询来访问属于另一个模型的模型。

     

例如,如果一个帐户属于一个用户,那么这可能是不安全的,无范围的查找

我可以看到,如果查找指向用户帐户,这将是一件坏事。在此应用程序中,@song参考是允许我在new视图中显示歌曲名称。

有一种更好的方法来获取歌曲名称吗?

类似的东西:

def new
  @arrangement = Arrangement.new
  @arrangement.song_id = params[:song_id]

  # Reworked code
  song = Song.find(params[:song_id])
  @song_title = song.name
  @artist_name = song.artist.name
end

撰写本文时的代码库位于我的github so_1分支上。

同一问题在我的项目中出现了很多,这似乎是找到更好的方法来组织我的项目的最简单的问题。

请注意,SO和Google搜索中与无范围查找有关的其他问题都无法回答此问题。

0 个答案:

没有答案