66176


現在いいね機能は実装できたんですが、  
全ユーザの「いいね」した画像 **だけ** を取得する事ができないです。  
因みに、ユーザ１人に対してfavorite_postsを実行しないとエラーが出ます。

[code]

    users=User.all
    users.favorite_posts
    を実行してもエラーが表示されます(rails cで検証済！)。
    
[/code]

下記のindexテンプレ内で`<%= link_to user.favorite_posts, user %>`を表示したら、  
次の様なモノが表示されます。これはどういう事なのでしょうか？  
ユーザがいいねした画像 **だけ** を取得出来ているのでしょうか？  
↓  
`#<Post::ActiveRecord_Associations_CollectionProxy:0x00007f9e3617af30>`  
こちらをimage_tagで画像を表示する事は出来るのでしょうか？  
次の様な感じで表示出来ると思ったんですが、出来ませんでした。  
`<%= image_tag user.favorite_posts.url %>`  
どなたかご教授頂ければ幸いです。

[code]

    class UsersController < ApplicationController
     def index
        @users = User.all
     end
    end
    
    [users/index.html.erb]
    <ul class="users">
      <% @users.each do |user| %>
        <li>
          <%= link_to user.favorite_posts, user %>
        </li>
      <% end %>
    </ul>
    
[/code]

[code]

    class User < ApplicationRecord
     has_many :posts, dependent: :destroy
     has_many :favorites, dependent: :destroy
     has_many :favorite_posts, through: :favorites, source: :post
    end
    
[/code]

[code]

    class Post < ApplicationRecord
     belongs_to :user
     has_many :favorites, dependent: :destroy
     validates :user_id, presence: true
     validates :img, presence: true
     mount_uploader :img, ImgUploader
    end
    
[/code]

[code]

    class Favorite < ApplicationRecord
      belongs_to :user
      belongs_to :post
      validates :user_id, presence: true
      validates :post_id, presence: true
    end
    
[/code]


CC BY-SA 4.0
2020-05-01T07:54:42.813
66175
2020-05-01T08:24:32.270
39925
question
ruby-on-rails ruby rails-activerecord
railsで全ユーザの「いいね」した画像だけを取得したい


`#<Post::ActiveRecord_Associations_CollectionProxy:0x00007f9e3617af30>`というのは、ActiveRecordの機能であるアソシエーション（`has_many`など）を使ったときに生成されるオブジェクトです。これは`Proxy`（代理）であるので、実際のレコードではありません（この場合は`Post`）。  
このオブジェクトには`each`を使うことができます。`each`を使うことで実際のレコードを取り出すことができます。

[code]

    user.favorite_posts.each do |post|
      <%= image_tag post.img_url %>
    end
    
[/code]

* * *
[code]

    users=User.all
    users.favorite_posts
    
[/code]

こう書くと動かない理由は`User.all`にあります。試しに`User.all.class`を実行すると、`User::ActiveRecord_Relation`が返ってくるかと思います。これは`User`ではなく、複数の`User`の集合です。  
「いいね」機能はあくまで個別の`User`と`Post`を結びつけるためのものであり、複数のユーザーの集合に対して「いいね」概念は意味を持ちません。上記のように`each`を使うなどして個別の`User`レコードを取得してから「いいね」した記事を取得していくことになります。


CC BY-SA 4.0
2020-05-01T08:24:32.270
66176
2020-05-01T08:24:32.270
442
66175
answer