2

私は、ユーザーがデフォルトのプロフィール写真とデフォルトの写真アルバムカバー写真を設定できるようにする機能を実装していました。ruby​​ on rails findメソッドを私の見解でどのように使うのですか、それとも悪い習慣ですか?

を私は、データベース内の次のテーブルを持っている:今、これらの機能を完了


は、ユーザー(複数可)(、つのプロファイルを持っている多くのPhotoAlbumsを持っている)
プロファイル(S)は(所属ユーザーは)photo_id
フォトアルバム(S)は、(多くの写真を持って、ユーザーに属しているが)写真(複数可)は(PhotoAlに属しphoto_id
含ま含まbum)

ユーザーのデフォルト写真を表示するのは簡単です。 ユーザーのデフォルトのアルバム写真を表示するのに問題があります。

これは私がユーザーのデフォルトのプロフィール写真を表示する方法である:

がUserController:

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

ユーザーがショーテンプレートを表示:photoalbumsのデフォルトの写真のために現在

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

私は内部の最初の写真を表示しますそのフォトアルバム:

<% 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 %> 

関連するコントローラのアクションは:

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

私は何をする必要があることは、ループが現在のでループしているフォトアルバムのphoto_idと一致するIDを持っている写真のテーブルから行を引き出し、forループ中にあります私のインデックスのテンプレートでは、私は一致する写真の行から画像を引き出して表示することができます。

私は経験豊富なプログラマから救いの手を必要と感じる。..

を無限のソリューションが、どれも仕事をしようとしました。

種類は、これを行う1つの効率的な方法は、あなたが最初の写真であることを保存に設定されたアルバムにdefault_photoを追加することです

+0

'belongs_to:photo'をアルバムに追加することはできません(既に' photo_id'カラムがあるので)、 'photo_album.photo'で表示できますか? –

+0

FYIでは、 'Photo.find(default_profile_photo_id)'の代わりに 'current_user.profile.photo'を実行できます。 'PhotoAlbum.find_all_by_user_id(current_user.id)'と同じですが、代わりに 'current_user.photo_albums'を使うことができます。 – mbillard

答えて

0

フォトアルバムモデル:

belongs_to :photo 

ビュー:フレデリックCheungsコメントに触発

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

非常に、非常に簡単な修正。

0

について。

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 

コントローラでは、デフォルトの写真をクエリに含めることができます。デフォルトの写真がすでにロードされているので、

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

そうすれば、あなたはphoto_album.default_photoを呼び出しているとき、あなたのビューで、それが再びデータベースにヒットしません。

+0

これは私には役に立たなかった。しかし、ありがとう。 – LondonGuy