krusty.ar-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org
2008-Jun-18 23:19 UTC
Plugin to copy data from related has_one model
Hi, this is my first post, so nice to meet you all and thanks in advance for your help. I have a "task" model that has it''s own CRUD interface, and can get "promoted" to another model, that is, it gets associated with a new record of another model. In the new form for the new model I want to prepopulate the fields that both models share so the user doesn''t have to copy them. I did this with the following code: class Task < ActiveRecord::Base belongs_to :entity, :polymorphic => true end ...and... class Issue < ActiveRecord::Base has_one :task, :as => "entity" alias_method :set_task=, :task def task=(t) task = Task.find(t) if t.class != Task self.set_task = t copy_task_attributes end def copy_task_attributes shared_attributes = self.task.attributes.reject do |attribute, value| !self.attributes.has_key? attribute end self.attributes = shared_attributes end end This works, if I create a new Issue: @issue = Issue.new :task => Task.find(params[:task]) It inherits the common attributes. The problem arises when I want to put all that logic into a plugin: module ActiveRecord module Acts module Taskable # need to change the name def self.included(base) base.extend(ClassMethods) end module ClassMethods def acts_as_taskable has_one :task, :as => "entity" alias_method :set_task=, :task include InstanceMethods end end module InstanceMethods def task=(t) task = Task.find(t) if t.class != Task self.set_task = t copy_task_attributes end def copy_task_attributes shared_attributes = self.task.attributes.reject do | attribute, value| !self.attributes.has_key? attribute end self.attributes = shared_attributes end end end end end Then if I do: class Issue < ActiveRecord::Base acts_as_taskable end It doesn''t pass the tests (the new record does not inherit the attributes). Does anyone knows why this happens? Or better yet, what''s the correct way of doing this? (I can''t stop thinking that rails already has this functionality and I can''t find it) Thanks. Lucas. --~--~---------~--~----~------------~-------~--~----~ 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 rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk-unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---
On 19 Jun 2008, at 00:19, krusty.ar-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org wrote:> > Then if I do: > > class Issue < ActiveRecord::Base > acts_as_taskable > endyou need to include your module in Issue (or in ActiveRecord::Base) and I can''t see you doing that anywhere (although if you didn''t do that then the call to acts_as_taskable would raise an unknown method error). If you''re feeling paranoid, check that the include InstanceMethods is picking up the right instance methods module ( you can make sure by expliciting it, ie ActiveRecord::Acts::Taskable::InstanceMethods Fred> > > It doesn''t pass the tests (the new record does not inherit the > attributes). > > Does anyone knows why this happens? Or better yet, what''s the correct > way of doing this? (I can''t stop thinking that rails already has this > functionality and I can''t find it) > > Thanks. Lucas. > --~--~---------~--~----~------------~-------~--~----~ > 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 rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org > To unsubscribe from this group, send email to rubyonrails-talk-unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org > For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en > -~----------~----~----~----~------~----~------~--~--- >
krusty.ar-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org
2008-Jun-19 13:52 UTC
Re: Plugin to copy data from related has_one model
On 19 jun, 06:46, Frederick Cheung <frederick.che...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote:> you need to include your module in Issue (or in ActiveRecord::Base) > and I can''t see you doing that anywhere (although if you didn''t do > that then the call to acts_as_taskable would raise an unknown method > error). If you''re feeling paranoid, check that the include > InstanceMethods is picking up the right instance methods module ( you > can make sure by expliciting it, ie > ActiveRecord::Acts::Taskable::InstanceMethods >Thanks for answering, I''m including it in ActiveRecord::Base (via the init.rb script), at least I thought so. I tryed this: require "acts_as_taskable" class Issue < ActiveRecord::Base extend CatBag::Acts::Taskable::ClassMethods include CatBag::Acts::Taskable::InstanceMethods acts_as_taskable end And removed the code from init.rb. But the problem remains. In the console I created a new issue instance and it has the copy_task_attributes method (and works). I also tryed changing the name of the new method (in the module) to :task2= (so it doesn''t clash with the default one), it gets added to the instances and it works fine. I''m suspecting that the task= method somehow it''s getting regenerated by rails at some point. but I don''t know how to check for it. Also, is this the "correct" way of facing this problem? Thanks. Lucas. --~--~---------~--~----~------------~-------~--~----~ 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 rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk-unsubscribe@googlegroups.com For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---