I have finally found the time to fix it. I refactoried the Hobo::Model::ViewHints class (that was quite voodoo) with very clear methods without any setter, and implemented a children method that delays the setting of the parent, so avoiding the circular reference when used inside the model.
https://github.com/tablatom/hobo/commit/0c0c94027b513700deccd9635cb3645de5ac258d Please, try it and let me know if anything is still missing. ciao dd On Wed, Jan 19, 2011 at 11:46 PM, Tomoaki Hayasaka < [email protected]> wrote: > Hi, > > > DIDN'T WORK: > > belongs_to :recipe > > belongs_to :category > > > > WORKED: > > belongs_to :category > > belongs_to :recipe > > I just found that the same fact separately :-) > > I noticed that there are circular dependencies between models. > Viewhint declarations needs complete reflections about related models > but it may not be solved if the viewhint is declared in a model class > and there are circular dependencies between models. > > For example using four_table: > > % git clone [email protected]:BI/RapidRails3ForHoboTutorialSourceCode.git > % cd RapidRails3ForHoboTutorialSourceCode/four_table > % rake db:migrate --trace 2>&1 | grep -C2 app/models > /var/lib/gems/1.9.1/gems/hobo-1.3.0.pre25/lib/hobo/model/view_hints.rb:17:in > `block in setter' > /var/lib/gems/1.9.1/gems/hobo-1.3.0.pre25/lib/hobo/model.rb:340:in > `children' > > /tmp/RapidRails3ForHoboTutorialSourceCode/four_table/app/models/category.rb:13:in > `<class:Category>' > > /tmp/RapidRails3ForHoboTutorialSourceCode/four_table/app/models/category.rb:1:in > `<top (required)>' > > /var/lib/gems/1.9.1/gems/activesupport-3.0.3/lib/active_support/dependencies.rb:454:in > `load' > > /var/lib/gems/1.9.1/gems/activesupport-3.0.3/lib/active_support/dependencies.rb:454:in > `block in load_file' > -- > /var/lib/gems/1.9.1/gems/hobo-1.3.0.pre25/lib/hobo/model.rb:180:in > `belongs_to_with_test_methods' > > /var/lib/gems/1.9.1/gems/hobo_fields-1.3.0.pre25/lib/hobo_fields/model.rb:93:in > `belongs_to_with_field_declarations' > > /tmp/RapidRails3ForHoboTutorialSourceCode/four_table/app/models/category_assignment.rb:9:in > `<class:CategoryAssignment>' > > /tmp/RapidRails3ForHoboTutorialSourceCode/four_table/app/models/category_assignment.rb:1:in > `<top (required)>' > > /var/lib/gems/1.9.1/gems/activesupport-3.0.3/lib/active_support/dependencies.rb:454:in > `load' > > /var/lib/gems/1.9.1/gems/activesupport-3.0.3/lib/active_support/dependencies.rb:454:in > `block in load_file' > -- > /var/lib/gems/1.9.1/gems/hobo-1.3.0.pre25/lib/hobo/model/view_hints.rb:17:in > `block in setter' > /var/lib/gems/1.9.1/gems/hobo-1.3.0.pre25/lib/hobo/model.rb:340:in > `children' > > /tmp/RapidRails3ForHoboTutorialSourceCode/four_table/app/models/recipe.rb:19:in > `<class:Recipe>' > > /tmp/RapidRails3ForHoboTutorialSourceCode/four_table/app/models/recipe.rb:1:in > `<top (required)>' > > /var/lib/gems/1.9.1/gems/activesupport-3.0.3/lib/active_support/dependencies.rb:454:in > `load' > > /var/lib/gems/1.9.1/gems/activesupport-3.0.3/lib/active_support/dependencies.rb:454:in > `block in load_file' > -- > /var/lib/gems/1.9.1/gems/hobo-1.3.0.pre25/lib/hobo/model/view_hints.rb:17:in > `block in setter' > /var/lib/gems/1.9.1/gems/hobo-1.3.0.pre25/lib/hobo/model.rb:340:in > `children' > > /tmp/RapidRails3ForHoboTutorialSourceCode/four_table/app/models/country.rb:12:in > `<class:Country>' > > /tmp/RapidRails3ForHoboTutorialSourceCode/four_table/app/models/country.rb:1:in > `<top (required)>' > > /var/lib/gems/1.9.1/gems/activesupport-3.0.3/lib/active_support/dependencies.rb:454:in > `load' > > /var/lib/gems/1.9.1/gems/activesupport-3.0.3/lib/active_support/dependencies.rb:454:in > `block in load_file' > > * > > - First, Country is loaded. > > - In Country, "children :recipes" initiates loading Recipe. > > - In Recipe, "children :categories" loads CategoryAssignment. > > - In CategoryAssignment, "belongs_to :category" loads Category. At > this point, "belongs_to :recipe" is not evaluated yet. > > - In Category, "children :recipes" doesn't initiate loading Recipe, > because it is already (at least partially) loaded. Instead, it > continues to do real "children" job. It extracts > source_reflection from through_reflection, but "belongs_to > :recipe" had not evaluated yet, so the source_reflection will be > nil and cause "undefined method `class_name' for nil:NilClass". > > There's a workaround. Use the traditional way: move the viewhints > into separate files in app/viewhints. > > ----- > Tomoaki Hayasaka <[email protected]> > > -- > You received this message because you are subscribed to the Google Groups > "Hobo Users" group. > To post to this group, send email to [email protected]. > To unsubscribe from this group, send email to > [email protected]<hobousers%[email protected]> > . > For more options, visit this group at > http://groups.google.com/group/hobousers?hl=en. > > -- You received this message because you are subscribed to the Google Groups "Hobo Users" 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/hobousers?hl=en.
