Ruby on rails Rails能够在数组上调用my class方法

Ruby on rails Rails能够在数组上调用my class方法,ruby-on-rails,Ruby On Rails,考虑到我在数据库中有以下类别和每个类别的一些记录: class User < ActiveRecord::Base has_many :user_roles has_many :roles, :through => :user_roles end class Role < ActiveRecord::Base has_many :user_roles has_many :users, :through => :user_roles def self

考虑到我在数据库中有以下类别和每个类别的一些记录:

class User < ActiveRecord::Base
  has_many :user_roles
  has_many :roles, :through => :user_roles
end

class Role < ActiveRecord::Base
  has_many :user_roles
  has_many :users, :through => :user_roles

  def self.method1
    "boo!"
  end
end
当然,
Role.all.method1
会像我预期的那样抛出一个未定义的方法错误


我的堆栈:Ruby 1.9.3p484,Rails 3.2.13在Ruby中,您可以使用“map”方法(也称为“collect”)在对象数组上调用相同的方法(或者,更一般地说,运行相同的代码块)——我更喜欢自己使用“collect”,因为在Java中,“map”就是我们在Ruby中所称的“hash”)

乙二醇

我不确定这是否是你想做的,但是你的问题不是很清楚

编辑:我刚刚想到,您希望对单个角色而不是数组调用method1。在这种情况下,你可以说

User.first.roles.first.method1

假设您确实需要第一个角色对象。

在Ruby中,您可以使用“map”方法(也称为“collect”)对对象数组调用相同的方法(或者更一般地说,运行相同的代码块)(我更喜欢自己使用“collect”,因为在Java中,“map”是Ruby中我们称之为“hash”的方法)

乙二醇

我不确定这是否是你想做的,但是你的问题不是很清楚

编辑:我刚刚想到,您希望对单个角色而不是数组调用method1。在这种情况下,你可以说

User.first.roles.first.method1

假设您确实需要第一个角色对象。

User.first.roles将返回数组,因此您无法对数组调用方法

您可以这样调用方法

User.first.roles.collect{|role| role.method1}

User.first.roles将返回数组,因此不能在数组上调用方法

您可以这样调用方法

User.first.roles.collect{|role| role.method1}

实际上它不是一个数组。 它是ActiveRecord::Associations::CollectionProxy 你可以在这里查看定义 activerecord/lib/active\u record/associations/collection\u proxy.rb


它已更改了将所有请求发送到父类的方法。\u missing。

实际上它不是数组。 它是ActiveRecord::Associations::CollectionProxy 你可以在这里查看定义 activerecord/lib/active\u record/associations/collection\u proxy.rb


它改变了将所有请求发送到父类的方法。\u missing。

好的-我理解你现在的问题-我想包括我在内的很多人都被这个问题弄糊涂了,对不起。我认为这种混乱是因为你改写了这个问题,因为“我如何才能做到这一点”是一个非常模糊和广泛的问题

我认为,具体来说,您的问题可以重新表述为“如果我对从
用户返回的角色对象数组调用角色类级别的方法(“method1”)。首先。roles
然后它返回与调用
Role.method1
相同的结果。它不应该失败吗,因为数组没有该方法?”

答案是,当rails返回一个关联的结果时,它混合了一个模块(或者更可能是一组模块),其中添加了额外的方法。其中一个方法是method_missing,它尝试调用已收集的类上的方法。所以,它仍然是一个数组,但它是一个带有额外方法的数组


如果你想知道它发生在哪里,请在method1方法中加入
raise“BANG!”
,然后再次调用你的代码:在堆栈跟踪中,你可以看到魔法发生在哪里。

好的-我理解你现在的问题-我想包括我在内的很多人都被这个问题弄糊涂了,对不起。我认为这种混乱是因为你改写了这个问题,因为“我如何才能做到这一点”是一个非常模糊和广泛的问题

我认为,具体来说,您的问题可以重新表述为“如果我对从
用户返回的角色对象数组调用角色类级别的方法(“method1”)。首先。roles
然后它返回与调用
Role.method1
相同的结果。它不应该失败吗,因为数组没有该方法?”

答案是,当rails返回一个关联的结果时,它混合了一个模块(或者更可能是一组模块),其中添加了额外的方法。其中一个方法是method_missing,它尝试调用已收集的类上的方法。所以,它仍然是一个数组,但它是一个带有额外方法的数组


如果你想知道它发生在哪里,请在method1方法中放入
raise“BANG!”
,然后再次调用你的代码:在堆栈跟踪中,你可以看到魔法发生在哪里。

我刚刚在最后的问题中添加了一个澄清部分。如果不清楚,请告诉我。你的澄清并不能让事情变得更清楚。如果你想让别人告诉你怎么做,你应该说明你想得到什么。“How is able”没有给出任何要求。我在问我如何能够成功地调用“User.first.roles.method1”而不引发任何错误?唯一的方法是扩展数组类以采用“method1”方法。但是我强烈怀疑你实际上并不想这么做。如果你更笼统地解释你想做什么,那么有人会告诉你。现在你说的是“我怎样才能用螺丝刀把钉子钉进去”。你可以得到这样的回答:“迅速放下你的手臂,狠狠地打它”,或者你可以得到这样的回答:“你真的不想这么做:我认为你应该用锤子来代替。或者,它实际上是螺丝钉,而不是钉子?”对不起,人们似乎误解了我的问题,认为我的问题中有拼写错误。关于你的编辑,答案是否定的。我真正的意思是
User.first.roles.method1
我只是在问题的末尾添加了一个澄清部分。如果不清楚,请告诉我。你的澄清并不能让事情变得更清楚。如果你想让别人告诉你怎么做,你应该说明你想得到什么。“我怎么能”没有给出任何要求。我在问我如何才能成功地调用“User.first.roles.method1”而不抛出任何错误?这是唯一可以这样做的方法