On Tuesday, April 26, 2016 at 11:48:15 PM UTC+2, Austin Ziegler wrote:
>
> I’m pretty sure I’m doing something wrong, but I’m not sure *what* I’m 
> doing wrong with a particular many_to_many setup. I have made a minimal 
> reproduction in a gist, but it’s still fairly complex. I have tried to make 
> sure that there are enough comments in-line.
>
> https://gist.github.com/8e424c08ae88a96692b13fee03f5b613
>

Thanks for this example, it made it much easier to test.
 

>
> In short, I have Category <=> Product through CategoryProduct. 
> CategoryProduct is almost a pure join table, but also has an attribute, 
> sort_order. When I select products through a particular category, I want 
> the products ordered by (categories_products.sort_order, 
> products.sort_order). This works.
>
> Category is also a tree structure using the rcte_tree plug-in, and I want 
> to be able to answer 'what are the products associated with category X and 
> its descendants'? This is something I am trying to do with the 
> `descended_from_category` dataset method on Product.
>
> The final twist to what I’m seeing is that I am using the 
> dataset_associations plug-in (I’m using many more than this, but this is 
> the one that seems to be breaking things most).
>
> So I’m left with a few questions:
>
> 1. Is this a bug?
>

This isn't a bug.  Dataset associations does not do a join, and therefore 
it is impossible for the query to work, since the products_categories table 
is not joined to the table. 
 
I think the best way to support what you want is to do an optional 
redundant join: http://pastie.org/10814366

You'll need to add the :dataset_associations_join => true association 
option to the association for that to work.

Please give that a shot and let me know if it works for you.  If so, I can 
add tests for it and try to commit it before the next release.

2. Even if this is a bug, is there a better way to do what I’m trying to do?
>

Maybe.  This is how I changed it.  I think it does the same thing with 
better performance, but there may be edge cases it doesn't 
handle: http://pastie.org/10814376
 

> 3. Having to do 
> category.this.select(:category_id).union(category.descendants_dataset.select(:category_id)
>  
> feels clunky compared to Closure Tree for Rails, which has a 
> self_and_descendants method. It might be doing the same thing internally 
> (haven’t looked); is this a worthwhile feature request/PR that I can make?
>

I don't think a self_and_descendants method makes sense.  If you already 
have the self, why would you want to load it again?  As my example above 
shows, if you want an array, just add the self to the array, and if you 
want a dataset, add an OR condition with self's primary key.  We don't have 
a self_and_children or self_and_ancestors.  The tree plugin does have a 
self_and_siblings method, but I'm not sure that's a good idea (I didn't 
write that plugin).  Even in that case, self_and_siblings is the simpler 
call, and siblings uses it and removes self.

That being said, self_and_descendants shouldn't be difficult to add, and 
without using a union.  Just change the base case in the CTE to use id 
instead of parent_id.

Thanks,
Jeremy

-- 
You received this message because you are subscribed to the Google Groups 
"sequel-talk" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/sequel-talk.
For more options, visit https://groups.google.com/d/optout.

Reply via email to