红宝石 - 对于引发ArgumentError无法找到原因:错误的参数数目(0给出,预计2..3)
问题描述:
我有一个类细分和我打电话segment.build
:红宝石 - 对于引发ArgumentError无法找到原因:错误的参数数目(0给出,预计2..3)
class Segment < ActiveRecord::Base
has_and_belongs_to_many :users
validates :filters, presence: true
def build
segment_builder = BuildSegment.new(self)
segment_builder.call
end
end
这是怎么BuildSegment外观:
class BuildSegment
def initialize(segment)
@segment = segment
end
def call
users_to_add = users_meeting_requirements_for(@segment)
add_users(@segment, users_to_add)
remove_users(@segment, users_to_add)
end
private
def remove_users(segment, users_to_add)
segment.users.where.not(id: users_to_add.uniq).delete_all
end
def add_users(segment, users_to_add)
segment.users << users_to_add.uniq
end
def users_meeting_requirements_for(segment)
users = Array.new
segment.filters.each do |filter|
users << users_passing_filter(filter)
end
users.flatten.uniq
end
这条线:users_to_add = users_meeting_requirements_for(@segment)
给我:
ArgumentError: wrong number of arguments (given 0, expected 2..3)
from /Users/patryk/.rvm/gems/ruby-2.3.0/gems/activerecord-4.2.4/lib/active_record/relation.rb:23:in `initialize'
为什么? users_meeting_requirements_for
只需要我提供的一个参数。我尝试了从users_meeting_requirements_for
内部调用的实例和方法变量的不同组合,但没有真正改变。
我迷失在这里。
答
问题隐藏得比我以前想象的更深。参数错误是由内users_meeting_requirements_for
我发现它称为另一种方法,通过行注释掉线,直到我已经达到了麻烦线。
更深的堆栈跟踪请这似乎与你如何建立关系有关,而与你所显示的代码无关。 – engineersmnky
只是要说清楚:ArgumentError发生在users_meeting_requirements_for内部,但方法调用本身不是问题。这似乎是一个ActiveRecord关系问题,并且您不会显示任何与Rails相关的信息。 –
这就是调用Segment.last.build后在控制台中返回的所有内容: '段加载(0.6ms)SELECT段“*”FROM“段”ORDER BY“段”。“id”DESC LIMIT 1 参数错误:的参数(给定为0,预期2..3) 从/Users/patryk/.rvm/gems/ruby-2.3.0/gems/activerecord-4.2.4/lib/active_record/relation.rb:23:in'初始化” 段是一个模型,而BuildSegment是在应用程序/服务/ build_segment.rb 我更新的原始代码 – Patryk