On Thursday, June 5, 2014 7:30:17 PM UTC-7, Dean Cornish wrote:
>
> Hi All,
>
> My dev pair and I are struggling a little bit-
> See attached.
> We can successfully navigate up and down on either side eg. App -> IR ->
> Depl and back again using:
>
> Given a Model structure of:
>
> class Application < Sequel::Model
> many_to_many :irs
> end
>
> class Ir< Sequel::Model
> many_to_many :applications
> many_to_many :releases
> many_to_many :deployments
> end
>
> class Release < Sequel::Model
> many_to_many :irs
> end
>
> class Deployment < Sequel::Model
> many_to_many :irs
> end
>
>
> #this returns everything linked from a releases up the chain in reverse
> Application.eager_graph(:irs => :releases).each {
> |t| puts "Applications down through to Releases: #{t.inspect}\n"
> }
>
> and
>
> #this returns everything linked from a release up the chain in reverse
> Release.eager_graph(:irs => :applications).each {
> |t| puts "Release up through to Applications: #{t.inspect}"
> }
>
> We can trivially modify the above to traverse Deployments and Applications
> in both directions.
>
> The issue- if you can help us- is with how do we have a single query that
> returns Application -> Irs and both Releases and Deployments something like:
>
> This is of course- fantasy code- but if you can help us to understand what
> might achieve this kind of outcome - it would be great. We're newbies with
> sequel :)
>
> #this returns just the fields we want for csv and other export
> Application.eager_graph([:irs => :deployments, irs =>
> releases]).select(:applications__application_name, :irs__ir_name,
> :releases__release_name, :deployments__deployment_number).each {
> |t| puts "Applications down via irs to both Release and Deployments:
> #{t.values}"
> }
>
> Any help you can provide would be awesome :)
>
You were almost there:
Application.eager_graph(:irs => [:deployments, releases])
Note that you have to use set_graph_aliases instead of select when using
eager_graph. However, for a csv export, an eager_graph is probably not
what you want, since eager_graph provides a object graph, and CSV really
deals best with a table (array of arrays). You probably want to use
association_join/association_left_join instead of eager_graph for a csv
export (in which case you can continue to use select, or maybe even
select_map). For a json export, you would probably want to use eager_graph
or something similar.
Note that you need to understand what is going on at an SQL level if you
use eager_graph. With the code given above, you could be generating huge
results sets due to the cartesian products involved. For example, if you
were eager loading 100 apps, and each had 100 irs, and each of those irs
had 100 releases and 100 deployments, you are looking at 100,000,000 rows
in the returned result set. Unless you are filtering or ordering based on
columns in the associated table, you are probably better off using eager
instead of eager_graph.
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 http://groups.google.com/group/sequel-talk.
For more options, visit https://groups.google.com/d/optout.