I''m having problems with what seems to be lazy loading behavior in Ruby on Rails. I have two objects in a parent-child relationship such as: class Order < ActiveRecord::Base has_many :items, :dependent => true end class Item < ActiveRecord::Base belongs_to :order end I put an instance of the Order object into the session using: session[:order] = Order.new I then extract the object in the controller and set it equal to the instance variable @order so that it is accessible in my view. def myaction @order = session[:order] end Now, my problem is that, in the view, the items array in @order is nil UNLESS I access the items array in the controller, e.g., def myaction @order = session[:order] logger.debug(@order.items) end This seems to me that Rails is loading the items array in a lazy fashion (which is great and expected), however, for some reason it *only* does this in the controller. That is, if I access the items array in the view, it doesn''t trigger the loading of the array. Am I doing something wrong here? Is there a way to control the lazy loading behavior of Rails? Help! -- Posted via http://www.ruby-forum.com/.
Jason, It''s been my experience that if you''re saving models into a session (as opposed to just the models'' unique id), then you can''t lazy-load them. In your application.rb file, try adding model :order See the Rails wiki article [1] for more info on session handling. [1] http://wiki.rubyonrails.com/rails/pages/HowtoWorkWithSessions/ On 12/20/05, Jason Fox <jfoxny-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote:> I''m having problems with what seems to be lazy loading behavior in Ruby > on Rails. I have two objects in a parent-child relationship such as: > > class Order < ActiveRecord::Base > has_many :items, :dependent => true > end > class Item < ActiveRecord::Base > belongs_to :order > end > > I put an instance of the Order object into the session using: > > session[:order] = Order.new > > I then extract the object in the controller and set it equal to the > instance variable @order so that it is accessible in my view. > > def myaction > @order = session[:order] > end > > Now, my problem is that, in the view, the items array in @order is nil > UNLESS I access the items array in the controller, e.g., > > def myaction > @order = session[:order] > logger.debug(@order.items) > end > > This seems to me that Rails is loading the items array in a lazy fashion > (which is great and expected), however, for some reason it *only* does > this in the controller. That is, if I access the items array in the > view, it doesn''t trigger the loading of the array. Am I doing something > wrong here? Is there a way to control the lazy loading behavior of > Rails? Help! > > > -- > Posted via http://www.ruby-forum.com/. > _______________________________________________ > Rails mailing list > Rails-1W37MKcQCpIf0INCOvqR/iCwEArCW2h5@public.gmane.org > http://lists.rubyonrails.org/mailman/listinfo/rails >
Thanks for the response, Ed... I did have the model :order set in the application.rb file as well as model :line, however, it still did not work. Lazy-loading of the items did work in the controller, when the object was retrieved from the session, just not in the view. I''ve changed my approach to just store the id of the order in the session and then load the order in my controller with the extra :include => :items parameter, e.g., @order = Order.find(:all, conditions => "id = #{session[:order_id]}", :include => items) I found out that this extra parameter will tell Rails to load the items array when the order object is loaded instead of loading the items in a lazy fashion. I then use the @order object in my view and it works fine. I would, however, still like to understand the details of how Rails does lazy loading. So if anyone out there knows, please drop me a line. Thanks! -- Posted via http://www.ruby-forum.com/.
> @order = Order.find(:all, conditions => "id = #{session[:order_id]}", > :include => items)Whoa, hold on there cowboy. Coding like that can get you an sql injection attack. (Unlikely with a session value, but you don''t want to get in the habit). @order = Order.find(:all, :conditions => [''id = ?'', session[:order_id]], :include => :items) -- rick http://techno-weenie.net