不确定定义我的find方法的位置(模型或控制器)

pez*_*ser 2 ruby controller model ruby-on-rails

(警告:Clueless Rails Newbie!)

在我的专辑视图的show.html.erb中,我在相册控制器中调用了一个公共方法:

<% albums_feature = find_albums_with_feature(feature.id) %>
Run Code Online (Sandbox Code Playgroud)

它会生成NoMethodError.

所以我将方法复制到我的Album模型中并尝试从视图中调用它:

<% albums_feature = Album.find_albums_with_feature(feature.id) %>
Run Code Online (Sandbox Code Playgroud)

但这也会得到一个NoMethodError.

我应该在哪里定义这种方法?

对于它的价值,该方法如下所示:

  def find_albums_with_feature(feature_id)
    albums_for_feature = Albums.find_by_sql(  
    ["select al.* from albums al, albums_features alfe
    where al.id = alfe.album_id
    and alfe.feature_id = ?", feature_id])
  end
Run Code Online (Sandbox Code Playgroud)

kle*_*lew 6

如果您想拥有可从视图访问的方法,则几乎没有选项:

  • 把它放在模型中
  • 把它放在帮助器里
  • 把它放在控制器中并添加一行"helper_method:find_albums_with_feature"

但我认为你可以做得更好.首先,不要考虑任何发现方法.把它放在控制器中.其次,您不需要指定自己的查找方法.可能你的模特中有这样的东西:

class Album << ActiveRecord::Base
  has_many :albums_features
  has_many :features, :through => :albums_features
end

class AlbumsFeature << ActiveRecord::Base
  belongs_to :album
  belongs_to :feature
end

class Feature << ActiveRecord::Base
  has_many :albums_features
  has_many :albums, :through => :albums_features
end
Run Code Online (Sandbox Code Playgroud)

有了它,您可以找到具有以下特定功能的相册:

@feature = Feature.find(id)
@albums = @feature.albums
Run Code Online (Sandbox Code Playgroud)

要么

@albums = Feature.find(id).albums
Run Code Online (Sandbox Code Playgroud)

它应该在你的控制器中.在视图中,您应该只显示结果.

如果您正在寻找有关关联的更多信息,请查看此处:http://guides.rubyonrails.org/association_basics.html.我认为这是你可以了解Rails的最佳地点 - 至少对我而言.