2011-06-14 39 views
0

build_foo调用中的第二个参数绝不会将其设置为Foo#initialize(即args[1]nil)。任何建议,以获得两个或更多的参数传递到Foo#initialize,同时保持*args初始化的唯一参数?如何在Rails 3的build_association调用中传递多个构造函数参数?

class Foo < ActiveRecord::Base 
    belongs_to :bar 
    def initialize *args 
     super() 
     self.total = args[0] + args[1] 
    end 
end 

class Bar < ActiveRecord::Base 
    has_one :foo 
    def do_something 
     build_foo 2, 3 # 3 never reaches Foo#initialize 
     build_foo [2,3] # args[0] == [2,3], which is not what's desired 
     save! 
    end 
end 
+0

为了您的方便:http://guides.rubyonrails.org/association_basics.html#detailed-association-reference – 2011-06-14 06:42:55

回答

3

要回答你的问题 - 你不能。只是因为build_foo只有documentation中定义的一个参数,即arguments = {},所以你应该只传递参数hash来初始化你的新记录。

您也不需要拨打#super#initialize,因为AR :: Base本身并没有定义#initialize

为什么你需要传递2个不同的参数,而不是参数散列?位置参数不会告诉您设置了哪个值,并且AR对象可能在表中有多个属性。

+0

谢谢MBO。在真正的代码中(与上面显示的简化版本相比),我做的没有参数哈希值,因为参数都是不同用户定义的类的实例(即args [n] .is_a?ClassA,args [m])。 is_a?ClassB等)。参数的位置并不重要,因为我可以通过is_a获得该类。并因此确定它是哪个参数。但是现在给出你的解释,我会考虑采用一个参数{}。感谢您的帮助。 – 2011-06-14 06:56:18

相关问题