我最近将我的项目添加到了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为:
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搜索中与无范围查找有关的其他问题都无法回答此问题。