>

먼저 영어에 미안합니다

따라서 이미 "사용자-게시물"에 일대 다의 연관 관계가 있습니다. 즉, 각 게시물에는 한 명의 작성자 만있을 수 있으며 이제는 사용자 프로필에 "즐겨 찾기 게시물"버튼을 추가하고 "즐겨 찾기에 추가"버튼을 추가하고 싶습니다 각 게시물에 질문이 올바른 방법을 구현하는 방법은 무엇입니까? 연결 후 사용자를 다시 작업해야합니까? 아니면 다른 모델을 만드시겠습니까? 약간 혼란 스러워요. 미리 감사드립니다!

실제로이 결과를 원합니다 :

@ user.posts#이 사용자가 작성한 모든 게시물을 반환

@ user.favorite_posts#이 사용자가 즐겨 찾기에 추가 한 게시물 반환

내 사용자 모델은 다음과 같습니다.

class User < ApplicationRecord
  mount_uploader :avatar, ImageUploader
  validates :username, presence: true, uniqueness: true, length: {in: 3..20}
  devise :database_authenticatable, :registerable,
     :recoverable, :rememberable, :validatable
  has_many :posts, dependent: :destroy
  has_many :comments, dependent: :destroy
  has_many :ratings
  enum role: [ :user, :admin ]
  def calculate_average
    ratings.blank? ? 0 : ratings.map(&:value).inject(:+) / ratings.count.to_f
  end
end

포스트 모델 :

class Post < ApplicationRecord
  mount_uploader :image, ImageUploader
  validates :body, presence: true
  validates :title, presence: true, length: { maximum: 50}
  belongs_to :user
  has_many :comments, dependent: :destroy
end

수정

이 작업을 수행 한 방식을 확인하면 원하는 방식으로 정확하게 작동합니다.

내 사용자 모델은 다음과 같습니다.

class User < ApplicationRecord
  mount_uploader :avatar, ImageUploader
  validates :username, presence: true, uniqueness: true, length: {in: 3..20}
  devise :database_authenticatable, :registerable,
     :recoverable, :rememberable, :validatable
  has_many :posts, dependent: :destroy
  has_many :comments, dependent: :destroy
  has_many :ratings
  has_many :favorites, dependent: :destroy
  has_many :favorite_posts, through: :favorites, source: "post"
  enum role: [ :user, :admin ]
  def calculate_average
    ratings.blank? ? 0 : ratings.map(&:value).inject(:+) / ratings.count.to_f
  end
end

  • 답변 # 1

    many-to-many 가 필요합니다  즐겨 찾는 게시물에 대한 관계, 처음에는이 명령을 실행하여 테이블 favorite_posts 를 작성하십시오.

    rails g model FavoritePost user:references post:references
    
    

    그럼

    rails db:migrate
    
    

    그런 다음 모델에 추가하면 다음과 같습니다.

    #=> model/user.rb
    class User < ApplicationRecord
        has_many :favorite_posts, dependent: :destroy # or you can use only this line except second if you will face any problem
        has_many :posts, through: :favorite_posts
    end
    #=> model/post.rb
    class Post < ApplicationRecord
        has_many :favorite_posts, dependent: :destroy
        has_many :users, through: :favorite_posts
    end
    #=> model/favorite_post.rb
    class FavoritePost < ApplicationRecord
      belongs_to :user
      belongs_to :post
    end
    
    

    그것은 관계 부분이었고, 이제 좋아하는 게시물 부분을 만듭니다. 최신 코드의 경우 컨트롤러를 만들 수 있습니다 (예 :

    rails g controller favorites
    
    

    그런 다음 경로 파일 :

    resources :favorites
    
    

    rake routes 를 사용하는 새로운 경로의 예 :

       favorites GET    /favorites(.:format)          favorites#index
                  POST   /favorites(.:format)          favorites#create
     new_favorite GET    /favorites/new(.:format)      favorites#new
    edit_favorite GET    /favorites/:id/edit(.:format) favorites#edit
         favorite GET    /favorites/:id(.:format)      favorites#show
                  PATCH  /favorites/:id(.:format)      favorites#update
                  PUT    /favorites/:id(.:format)      favorites#update
                  DELETE /favorites/:id(.:format)      favorites#destroy
    
    

    보기 파일에서 다음과 같이 추가하십시오 :

    # For creating favorite
    <%= link_to "Favorite", favorites_path(user: current_user, post: post.id), class: 'btn bf-save-btn', method: :post, data: {disable_with: "Saving..."}, title: "Add to favorite" %>
    # For deleting favorite list
    <%= link_to "Unfavorite", favorite_path(post.id), class: 'btn af-save-btn', method: :delete, data: {disable_with: "Removing...."}, title: "Remove from favorite" %>
    
    

    favorites_controller.rb 에서 :

    def index
        @saves = current_user.favorite_post
    end
    # index.html.erb
    <% @saves.each do |fav| %>
         <%= link_to fav.post.post_title, post_path(fav.post) %>
    <% end %>
    def create
        @save = FavoritePost.new(post_id: params[:post], user: current_user)
        respond_to do |format|
            if @save.save
                flash[:success] = 'Saved'
                format.html { redirect_to request.referer }
                format.xml  { render :xml => @save, :status => :created, :location => @save }
            else
                format.html { redirect_to request.referer }
                format.xml  { render :xml => @save.errors, :status => :unprocessable_entity }
            end
        end
    end
    def destroy
        post = Post.find(params[:id])
        @save = FavoritePost.where(user_id: current_user.id, post_id: post.id).first
        respond_to do |format|
            if @save.destroy
                flash[:error] = 'Unsaved'
                format.html { redirect_to request.referer, status: 303  }
                format.js { redirect_to request.referer, status: 303  }
                # format.xml  { head :ok }
            end
        end
    end
    
    

    좋아하는/좋지 않은 기능입니다. 이제 Favorite 를 보여줄 때 몇 가지 논리를 만들어야합니다.  그리고 언제 Unfavorite .

    이 요구 사항에는 여러 가지 방법이 있기 때문에 처음에는이를 이해해야합니다. 그러면 원하는대로 할 수 있습니다.

    또한 페이지를 다시로드하지 않고이를 달성하려면 Ajax 를 사용해보십시오. .

    업데이트

    class User < ApplicationRecord
        mount_uploader :avatar, ImageUploader
        validates :username, presence: true, uniqueness: true, length: {in: 3..20}
        devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :validatable
        has_many :posts, dependent: :destroy
        has_many :comments, dependent: :destroy
        has_many :ratings
        # Newly added
        has_many :favorite_posts, dependent: :destroy # or you can use only this line except second if you will face any problem
        has_many :posts, through: :favorite_posts
        enum role: [ :user, :admin ]
        def calculate_average
            ratings.blank? ? 0 : ratings.map(&:value).inject(:+) / ratings.count.to_f
        end
    end
    
    

    도움이 될 것입니다.

  • 답변 # 2

    fool-dev의 답변으로 즐겨 찾는 게시물에 직접 액세스 할 수 없으므로 색인보기에는 루프가 필요합니다. Prasanna의 접근 방식으로이 문제를 해결할 수 있지만 그의 답변은 불완전하고 표절로 불공정하게 고발되었습니다. 완전한 접근 방식은 다음과 같습니다.

    다 대다관계가 필요합니다. 사실, 조인 모델과 테이블이 필요합니다. 그러나이 모델은 보조적입니다. 중요한 논리는 없어야하며 컨트롤러 나 뷰가 필요하다고 생각하지 않습니다.

    class User < ApplicationRecord
      has_many :posts, dependent: :destroy # Posts created by this user
      has_many :favs, dependent: :destroy  
      has_many :fav_posts, through: :favs # Favorite posts for this user
    end
    class Post < ApplicationRecord
      belongs_to :user
      has_many :favs, dependent: :destroy
      has_many :fav_users, through: :favs # Users who have this post as favorite
    end
    class Fav < ApplicationRecord
      belongs_to :user
      belongs_to :post
    end
    
    

    이 기능을 사용하면 사용자 클래스에서 두 가지 다른 메소드를 사용하여 사용자가 작성한 모든 게시물과 즐겨 찾는 모든 게시물에 액세스 할 수 있습니다.

    @posts = current_user.posts         # Posts created by this user
    @fav_posts = current_user.fav_posts # Favorite posts
    
    

    보기에서 :

    <h1><% current_user.name %></h1>
    <h2>Your posts</h2>
    <%= render @posts %>
    <h2>Your favorite posts from other users</h2>
    <%= render @fav_posts %>
    
    

    좋아하는 게시물을 작성하거나 보거나 삭제하기 위해 컨트롤러가 필요하지 않습니다. 이 로직을 사용자 또는 포스트 컨트롤러에서 처리하십시오. 예를 들어 게시물을 즐겨 찾기 또는 즐겨 찾기 해제하려면 PostsController에 즐겨 찾기 및 즐겨 찾기 메소드를 추가하십시오.

    def fav
      current_user.fav_posts << Post.find(params[:id])
    end
    def unfav
      current_user.favs_posts.destroy(Post.find(params[:id]))
    end
    
    

    보기에서 :

    <%= link_to "Favorite", fav_post_path(id: post.id) %>
    <%= link_to "Unfavorite", unfav_post_path(id: post.id) %>
    
    

    이 방법들을 경로에 추가해야합니다 :

    post '/posts/:id/fav', to: 'posts#fav', as: 'fav_post'    
    post '/posts/:id/unfav', to: 'posts#unfav', as: 'unfav_post'
    
    

  • 답변 # 3

    post_id 및 user_id가 저장된 'UserFavoritePost'에 대한 새 모델을 만듭니다. 그리고 favorite_posts에 대한 맞춤 연결을 만듭니다

    class UserFavoritePost < ApplicationRecord
      belongs_to :post    
      belongs_to :user
    end
    class User < ApplicationRecord
      has_many :posts, dependent: :destroy
      has_many :user_favorite_posts
      has_many :favorite_posts, throught: :user_favorite_posts, class: 'Post'
    end
    
    

  • 이전 DateTime를 변환하는 방법? C #의 DateTime과 두 날짜를 비교하는 방법
  • 다음 variables - 다트 - dart에서 반복기 값을 콜백에 전달하려면 어떻게해야합니까?