Rails: collecting records from grandparent's attributes -


i've got deep-nested relationship so:

>> @document.template_variables.first.master.box.stack => #<stack id: 6, name: "contact information", direction: "down", x: 145.0, y: 145.0, template_id: 28, width: 55, page: 1, html_box: "column_right"> 

master isn't quite normal rails relationship, , it's defined in templatevariable so:

def master   templatevariable.find(master_id) if master_id.present? end 

so it's kinda referring instance of itself, can see log output on top works fine.

my issue need all templatevariables parent stack matches box name so:

scope :by_box, -> (b) { where('box.stack.html_box' => b) } 

but no matter try, in console, can't query right.

>> @document.template_variables.where(master.box.stack.html_box != nil) !! #<nameerror: undefined local variable or method `master' #<#<class:0x007fd287cd9888>:0x007fd28bb11ee8>> 

and scope returns error:

activerecord::statementinvalid - pg::undefinedtable: error:  missing from-clause entry table "box" line 1: ...where "template_variables"."document_id" = $1 , "box"."sta... 

any help? missing?

i think should create answer here. scope raised error because did not joins table boxes , stacks before clause where('box.stack.html_box' => b). rails convert sql query

select "template_variables".* "template_variables" "box"."stack.html_box" = ... 

as can see, query has no idea clause. "box" table? "stack.html_box" column? have join boxes , stacks first, clause where(stacks: { html_box: b }) or where('stacks.html_box' => b }) (stacks plural because table name), convert sql query

select "template_variables".* "template_variables" inner join "boxes" on "boxes"."id" = "template_variables"."box_id" inner join "stacks" on "stacks"."id" = "boxes"."stack_id" "stacks"."html_box" = ... 

and work well. suggestion, shoud define master belongs_to association, like

belongs_to :master, class_name: 'templatevariable', foreign_key: :master_id 

hope help.


Comments

Popular posts from this blog

php - How to display all orders for a single product showing the most recent first? Woocommerce -

asp.net - How to correctly use QUERY_STRING in ISAPI rewrite? -

angularjs - How restrict admin panel using in backend laravel and admin panel on angular? -