在我看来,我如何使用 ruby?? on rails find 方法,或者这是不好的做法?

How do I use a ruby on rails find method in my view or is that bad practice?

所以我实现了一个功能,允许用户设置默认的个人资料照片和默认的相册封面照片。

现已完成这些功能:

我的数据库中有以下表格:
用户(有一个个人资料,有很多相册)
个人资料(属于用户)包含 photo_id
相册(属于用户,有很多照片)包含 photo_id
照片(属于相册)

显示用户默认照片很简单。
我现在无法显示用户的默认相册照片。

这是我显示用户默认个人资料照片的方式:

用户控制器:

1
2
default_profile_photo_id = current_user.profile.photo_id
 @default_photo = Photo.find(default_profile_photo_id)

用户视图显示模板:

1
<%= link_to image_tag(@default_photo.image, :width =>"200"), @user.username %>

目前对于相册的默认照片,我会显示该相册中的第一张照片:

1
2
3
4
5
6
   <% for photo_album in @photoalbums %>
   <%= link_to photo_album.album_title, photo_album %>    
   <%= link_to image_tag(photo_album.photos.first.image, :width =>"100"), photo_album %>
   <%= link_to"Edit Album", edit_photo_album_path(photo_album) %>
   <%= photo_album.photos.size %>
   <% end %>

相关控制器动作:

1
2
3
  def index
    @photoalbums = PhotoAlbum.find_all_by_user_id(current_user.id)
  end

我需要做的是在 for 循环期间,从照片表中拉出一行,该行的 id 与循环当前正在循环的相册的 photo_id 相匹配,以便在我的索引模板上我可以从中拉出图像匹配的照片行并显示它。

我尝试了无数的解决方案,但都没有奏效..

我觉得我需要一位经验丰富的程序员的帮助。

亲切的问候


相册型号:

1
belongs_to :photo

视图:

1
image_tag(photo_album.photo(photo_album.photo_id).image

受 Frederick Cheung 评论启发的非常非常简单的修复。


执行此操作的一种有效方法是将 default_photo 添加到您在保存时设置为第一张照片的相册。

1
2
3
4
5
6
7
8
9
10
11
12
class PhotoAlbum
  belongs_to :user
  has_many :photos
  belongs_to :default_photo

  before_save :set_default_photo

  protected
    def set_default_photo
      self.default_photo = self.photos.first
    end
end

然后在您的控制器中,您可以在查询中包含默认照片。

1
2
3
def index
  @photo_albums = current_user.photo_albums.include(:default_photo)
end

这样,在您调用 photo_album.default_photo 时,它不会再次访问数据库,因为默认照片已经加载。