Excellent! Thanks for the clarification, Fred! I think adding the trait_values as an inner join will do the trick.
-Chris On Sat, Feb 14, 2009 at 5:26 AM, Frederick Cheung <[email protected]> wrote: > > > > On Feb 14, 12:43 am, Chris <[email protected]> wrote: >> Hi all, >> >> I'd really appreciate any help / advice on this problem. When I test >> this >> >> def edit >> @entity = Entity.find(params[:id], >> :include => :key_factors) >> @traits = Trait.find :all, >> :include => :trait_values, >> :joins => :trait_values, >> :joins => "LEFT OUTER JOIN key_factors ON >> key_factors.trait_value_id = trait_values.id AND >> key_factors.entity_id="[email protected]_s, >> :order => 'traits.ordering, traits.name' >> @frequencies = Frequency.find :all, >> :order => 'value' >> end >> >> I get the error "ActiveRecord::StatementInvalid: Mysql::Error: Unknown >> column 'trait_values.id' in 'on clause': SELECT `traits`.* FROM >> `traits` LEFT OUTER JOIN key_factors ON key_factors.trait_value_id = >> trait_values.id AND key_factors.entity_id=953125641". I would have >> thought that since I'm including trait_values then that table would be >> in the SQL statement. However, what I see in the development log is: >> >> [4;36 Entity Load (0.0ms) SELECT * FROM `entities` WHERE >> (`entities`.`id` = 1) >> [4;35 KeyFactor Load (0.0ms) SELECT `key_factors`.* FROM >> `key_factors` WHERE (`key_factors`.entity_id = 1) >> [4;36 Trait Load (0.0ms)Mysql::Error: Unknown column >> 'trait_values.id' in 'on clause': SELECT `traits`.* FROM `traits` LEFT >> OUTER JOIN key_factors ON key_factors.trait_value_id = trait_values.id >> AND key_factors.entity_id=1 ORDER BY traits.ordering, traits.name >> >> Which suggests that Rails is doing a separate call for each include... >> and a bit of research on the API confirms that. However, in an earlier >> version of rails this worked fine - the log for running the exact same >> code shows (more or less - replaced a long field list with '*' to make >> reading easier) > > Yup that is what happens. It should fall back to the old code in cases > like this however I suspect that it doesn't check the :joins clause > for tables for that need to be included in the old way. > I'm assuming you do actually want that include (and that it wasn't > just an easy way of triggering a join) since the answer is probably a > lot easier if you don't need the include. > Rails will fall back to the old code whenever it sees something that > looks like you're using a table that isn't the base table or provided > through the joins clause. As I said, unfortunately I don't think it > checks the join clause in this way for references to tables. > > You should be able fix it by adding a dud condition that references > the included table. I suspect it was just you poking around but doing > > :joins => :trait_values, > :joins => "LEFT OUTER JOIN key_factors ON ... " > > doesn't do anything since a hash can only have one value for a given > key. > YOu could also try > > :joins => "INNER JOIN trait_values ON ... LEFT OUTER JOIN key_factors > ON ... " > > This would allow the query to run ok, however I suspect it would still > process the include off the back of a second query. > > Fred >> >> [4;36 Trait Load Including Associations (0.000000) SELECT * FROM >> traits LEFT OUTER JOIN trait_values ON trait_values.trait_id = >> traits.id LEFT OUTER JOIN key_factors ON key_factors.trait_value_id = >> trait_values.id AND key_factors.entity_id=1 ORDER BY traits.ordering, >> traits.name >> >> My models are: >> >> class Trait < ActiveRecord::Base >> has_many :trait_values, :dependent => :destroy >> end >> >> class TraitValue < ActiveRecord::Base >> belongs_to :trait >> has_many :key_factors, :dependent => :destroy >> has_many :trait_value_images, :foreign_key => >> 'related_id', :dependent => :destroy >> >> def sorter >> [(self.trait.ordering || "0"),(self.trait.name || "0"), >> (self.ordering || "0"),(self.name || "")] >> end >> >> end >> >> The API suggests that having conditions on a has_many association >> might do the trick, but the condition would be to be able to be >> dynamically specified ("...key_factors.entity_id="[email protected]_s) >> and I don't see how that's possible when defining the condition on the >> association in the model (not sure whether that's because it actually >> isn't possible or just because I don't know Rails well enough). >> >> Please help! >> >> -Chris Warren > > > --~--~---------~--~----~------------~-------~--~----~ 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 [email protected] To unsubscribe from this group, send email to [email protected] For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---

