0
votes

In rails 4.2, I am using paginate method to get paginated records from db. I want to get first page, if specified page is not present in the db.

I am using following active record functionality to fetch paged records from database. So If the page number is mentioned 2 and there is only one row in db, the query returns null.

@records = @user.where("some where clause here").paginate(per_page: 1, page: params[:page].presence || 1).

I want to fetch first record if specified page doesn't exist in db. It fetches first record, if params[:page] is empty, but if database doesn't have specified page, it returns nill.

2

2 Answers

0
votes

I think this is what you need:

@records = @user.where(title: 'bla').paginate(per_page: 1, page: params[:page].presence || 1).

@results = @records.empty? ? @user.where(title: 'bla').paginate(per_page: 1, page: 1) : @records

This will mean if your @records instance variable has any records it will be returned in @results, and if it doesn't your app will return the first page of results. To make it a bit more readable:

@first_page_records = @user.where(title: 'bla').paginate(per_page: 1, page: 1)
@custom_page_records = @user.where(title: 'bla').paginate(per_page: 1, page: params[:page].presence || 1)

@results = @custom_page_records.empty? ? @first_page_records : @custom_page_records
0
votes

Although My answer is similar to one posted by Mark. But I still posted it, as it will run an extra query only if original query returns empty records.

@records = @users.valid_users_with_invalid_msg.paginate(per_page: 1, page: params[:page].presence || 1)

if @records.empty?
  @records = @users.valid_users_with_invalid_msg.paginate(per_page: 1, page:  1)
end

Note: I have moved the where clause in scope