[LRUG] Advice: manipulating ActiveRecord objects [newbie]

Julius jeronimovicius at gmail.com
Mon Dec 14 06:05:54 PST 2015


Do you need all fields from all tables? Or just `id`s from `feed_details` to get further data? Maybe .select would help.

Also if all that data is necessary and it is huge maybe it is time to consider paginating it with .limit of .offset?

Julius

> On 14 Dec 2015, at 13:46, Marco Iannone <marco.iannone at gmail.com> wrote:
> 
> ​Hello,
> 
> ​Ruby newbie question alert​: many apologies if it's too basic, or not the type of questions for this forum. 
> At least I can say we tried hard before going to StackOverflow <http://stackoverflow.com/questions/34227034/manipulating-activerecord-objects-to-build-json>​, and now here.​
> 
> We're trying to ​ensure a webpage loads faster. The main issue ​relates to a few activerecord-generated queries on that page.
> 
> If you look at the SQL they generate, the queries are as follows (all code a bit simplified):
> 
> select * from feed_details where account_id = 5
> select * from feeds where id in (VERY_LONG_LIST_OF_IDS_FROM_FIRST_QUERY)
> select * from feeds_metadata where feed_id in (VERY_LONG_LIST_FROM_FIRST_QUERY)
> select * from documents where feed_id in (VERY_LONG_LIST_FROM_FIRST_QUERY)
> 
> All the indexes are in place, but we verified that they'd take less than half the time by changing ​each of them to:
> 
> select * from feeds, feed_details where id = feed_id and account_id = 5
> select * from feeds_metadata fm, feed_details fd where fm.feed_id = fd.feed_id and account_id = 5
> select * from documents where d, feed_details fd where d.feed_id = fd.feed_id and account_id = 5
> 
> So far, so simple. 
> 
> Here is the ​Rails issue: these queries have been generated by this code in the FeedDetail model:
> 
> class FeedDetail < ActiveRecord::Base
> 
>   has_many :feeds
>   has_many :feeds_metadata
>   has_many :documents
> 
>   scope :feeds_data_for_account, ->(current_account_id) do
>     FeedDetail
>               .includes(:feeds, :feeds_metadata, :documents)
>               .where(
>                   account_id: current_account_id
>               )
>   end
> 
> This generates an active record object with the data from the above-mentioned queries, that is used in the controller to build the JSON that is sent to the webpage as in below (see feeds_data line):
> 
>   def index
>     consumer          = ConsumerWithAccount.new(current_user.account)
>     feed_builder      = FeedBuilder
>     feeds_data        = FeedDetail.feeds_data_for_account(current_user.account.id <http://current_user.account.id/>)
> 
>     render json: ResponseBuilder.new(consumer, feed_builder, feeds_data)
>   end
>  
> To use the faster queries, we were hoping to build the feeds_data activerecord object ​​by using the faster queries; this gets passed to the JSON builder​. That would ​seem to require getting rid of the "involves", which (seemingly) uses the IN ().
> 
> If useful, we have the ​more effective activerecord for the 3 queries, they look like:
> Feed.joins(:feed_details).where(feed_document_sets: {account_id: current_account_id})
> 
> But we couldn't figure out how to build that​ ​​activerecord object​, or one that can be parsed in a similar way by the responsebuilder​: therein lies the proverbial rub.
> Intense googling and referring to rails docs hasn't helped.​
> 
> The plan B ​would be to re-write the responsebuilder to take a different type of object, but that looks more complicated.
> 
> The person who wrote this is no longer with the company.
> 
> Plan C is to shake very hard the computer and hope for the best.
> 
> Any suggestions would be much appreciated​, off/on list​.
> 
> ​Thanks,
> Marco​
> 
> _______________________________________________
> Chat mailing list
> Chat at lists.lrug.org
> Archives: http://lists.lrug.org/pipermail/chat-lrug.org
> Manage your subscription: http://lists.lrug.org/options.cgi/chat-lrug.org
> List info: http://lists.lrug.org/listinfo.cgi/chat-lrug.org

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.lrug.org/pipermail/chat-lrug.org/attachments/20151214/784c69a1/attachment-0002.html>


More information about the Chat mailing list