Home > front end >  Need help creating a GET route
Need help creating a GET route

Time:07-11

I need help implement a route to fetch all blog posts by author_ids.

  • The post that we're fetching needs to have at least one of the authors specified in the passed in author_ids parameters. I've created a helper function to help me fetch all blog posts by their ID, Post.get_posts_by_user_id
  • I also need to sort the posts by query parameters given. Also, I need to delete any duplicated posts as efficiently as possible.

I'm stumped here because of the way author_ids is being given. (I'm extremely new to Ruby)

This is what we should get returned from the route: "posts": [{"id": 1, "likes": 960, "popularity": 0.13, "reads": 50361, "tags": ["tech", "health"], text": "Some text here."}, ... ]

Query parameters expected to be given to this route

Update:

After creating the index method, it seems that it is only getting one post rather than getting all posts that are associated with the passed in authorIds.

def index
  posts = current_user
  .posts
  .where(id: params[:authorIds].split(','))
  .order(sort_column => sort_direction)

  if posts
    render json: { post: posts }, status: :ok
  else
    render json: {error: posts.errors}, status: :unprocessable_entity
  end
end

Test cases

Update 2:

Post Model:

class Post < ApplicationRecord


# Associations
  has_many :user_posts
  has_many :users, through: :user_posts, dependent: :destroy

  # Validations
  validates :text, presence: true, length: { minimum: 3 }
  validates :popularity, inclusion: { in: 0.0..1.0 }

  def tags
    if super
      super.split(",")
    end
  end

  def tags=(value)
    if value.kind_of? Array
      super value.join(",")
    else
      super value
    end
  end

  def self.get_posts_by_user_id(user_id)
    Post.joins(:user_posts).where(user_posts: { user_id: user_id })
  end
end

User Model:

class User < ApplicationRecord
  has_secure_password

  # Associations
  has_many :user_posts
  has_many :posts, through: :user_posts, dependent: :destroy

  # Validations
  validates :username, :password, presence: true
  validates :password, length: { minimum: 6 }
  validates :username, uniqueness: true
end

User_post Model:

class UserPost < ApplicationRecord
 belongs_to :user
 belongs_to :post
end

CodePudding user response:

I would do it like below.

def index
  author_ids_array = params[:ids].to_s.split(',')

  Post
    .get_posts_by_user_id(author_ids_array)
    .order(sort_column => sort_direction)
end

private

def sort_column
  allow_list = %w[id reads likes popularity]
  params[:sortBy].presence_in(allow_list) || allow_list.first
end

def sort_direction
  allow_list = %w[asc desc]
  params[:direction].presence_in(allow_list) || allow_list.first
end
  • Related