With any ORM there will be instances where pure object relationships
make for either very complex code or code that does not scale well
performance-wise as the data set involved grows when compared to the
efficiency of the underlying database's SQL engine.

In those circumstances remember that views and stored procedures are
available - schema_plus is a gem that let's you define views as a part
of your schema.r b  file and while stored procedures violate the
ActiveRecord design pattern they can be used with AR and are sometimes
necessary in order to create a system that scales and performs well.

Max

On 1/6/12, Peter Vandenabeele <pe...@vandenabeele.com> wrote:
> On Fri, Jan 6, 2012 at 2:13 AM, Linus Pettersson <linus.petters...@gmail.com
>> wrote:
>
>> Hi!
>>
>> I have an app that manages products. I import the products from several
>> resellers and they all name their categories different. Because of this I
>> have resellercategories that are mapped to my own subcategories.
>>
>> Categories
>> - Subcategories (belongs_to Category)
>>
>> Resellercategories (belongs_to Subcategory)
>>
>> Products (belongs_to Resellercategory)
>>
>>
>>
>> Now I want to show the categories in a special way. If the user filters
>> products by gender, let's say 'female', then I only want to show the
>> categories and subcategories which have products for females. This is
>> where
>> I'm stuck!
>>
>> I created a query like this that actually gets the correct "Categories".
>> But it doesn't seem restrict the subcategories.
>>
>> The query:
>> http://snipt.net/Linuus/categories-1?key=2d5d54fd573f0afe60eaa3c47a23fd4d
>>
>
> How did you actually _retrieve_ the subcategories.
>
> By using the "joins" there, there is a chance your query only retrieves
> the categories
> (as in "SELECT "categories".* FROM "categories" INNER JOIN "subcategories"
> ...).
> So maybe you have a second query for the subcategories (that is not
> correctly filtered then)
>
> Maybe you do `category.subcategories`
>
> @menu_categories = Category.joins(:subcategories)
>                           .joins("INNER JOIN resellercategories AS r ON
> subcategories.id = r.subcategory_id")
>                           .joins("INNER JOIN products AS p ON r.id =
> p.resellercategory_id")
>                           .group("categories.id")
>                           .order("categories.name ASC")
>                           .where("p.gender = 'unisex' OR p.gender = ?",
> session[:gender])
>
> @menu_categories.each do |mc|
>   mc.subcategories
>   ..
> end
>
> This `mc.subcategories` executes a new query that is not taking into
> account the filtering.
> So, you are doing 1+n queries (and the n queries are not what you expect).
>
> Maybe you need
>
> @menu_categories = Category.includes(:subcategories)  # INCLUDES here
>                           .joins("INNER JOIN resellercategories AS r ON
> subcategories.id = r.subcategory_id")
>                           .joins("INNER JOIN products AS p ON r.id =
> p.resellercategory_id")
>                           .group("categories.id")
>                           .order("categories.name ASC")
>                           .where("p.gender = 'unisex' OR p.gender = ?",
> session[:gender])
>
> That will get the subcategories from the db in 1 (more complex) query with
> results that are
> filtered. If you then do
>
> @menu_categories.each do |mc|
>   mc.subcategories # this should not trigger new SQL queries
>   ..
> end
>
> Do this rails console and read the SQL carefully (or look in your
> development log
> carefully which SQL is executed).
>
> HTH,
>
> Peter
>
>
> --
> Peter Vandenabeele
> http://twitter.com/peter_v
> http://rails.vandenabeele.com
>
> --
> You received this message because you are subscribed to the Google Groups
> "Ruby on Rails: Talk" group.
> To post to this group, send email to rubyonrails-talk@googlegroups.com.
> To unsubscribe from this group, send email to
> rubyonrails-talk+unsubscr...@googlegroups.com.
> For more options, visit this group at
> http://groups.google.com/group/rubyonrails-talk?hl=en.
>
>

-- 
You received this message because you are subscribed to the Google Groups "Ruby 
on Rails: Talk" group.
To post to this group, send email to rubyonrails-talk@googlegroups.com.
To unsubscribe from this group, send email to 
rubyonrails-talk+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/rubyonrails-talk?hl=en.

Reply via email to