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

时间:2009-05-10 16:24:25

标签: ruby-on-rails ruby model controller

(警告:Clueless Rails Newbie!)

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

<% albums_feature = find_albums_with_feature(feature.id) %>

它会生成 NoMethodError

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

<% albums_feature = Album.find_albums_with_feature(feature.id) %>

但是这也会得到 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

2 个答案:

答案 0 :(得分: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

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

@feature = Feature.find(id)
@albums = @feature.albums

@albums = Feature.find(id).albums

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

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

答案 1 :(得分:2)

在相册模型中。虽然需要自我:

def self.find_albums_with_feature(feature_id)