Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何传递单个对象、集合&/或者将ActiveRecord集合对象添加到类初始化方法?_Ruby On Rails_Ruby_Activerecord_Ruby On Rails 5 - Fatal编程技术网

Ruby on rails 如何传递单个对象、集合&/或者将ActiveRecord集合对象添加到类初始化方法?

Ruby on rails 如何传递单个对象、集合&/或者将ActiveRecord集合对象添加到类初始化方法?,ruby-on-rails,ruby,activerecord,ruby-on-rails-5,Ruby On Rails,Ruby,Activerecord,Ruby On Rails 5,我有一个类似这样的类: class ExtractDiffLineInfo def initialize(*diffs) @diffs = diffs end def all_line_num_starts result = [] @diffs.each do |diff| diff.body.lines.each do |diff_line| if (m = diff_line.match(/\A@@\s+\-(\d+),(\

我有一个类似这样的类:

class ExtractDiffLineInfo

  def initialize(*diffs)
    @diffs = diffs
  end

  def all_line_num_starts
    result = []
    @diffs.each do |diff|
      diff.body.lines.each do |diff_line|
        if (m = diff_line.match(/\A@@\s+\-(\d+),(\d+)\s+\+(\d+),(\d+)\s+@@/))
          a_start = m[1].to_i
          result << a_start + 3
        end
      end
    end
    result
  end
@diff_line_nums = ExtractDiffLineInfo.new(@diffs).all_line_num_starts
class ExtractDiffLineInfo

  def self.for_one_diff(diff)
    new([diff])
  end

  def self.for_many_diffs(diffs)
    new(diffs)
  end

  def initialize(*diffs)
    @diffs = diffs
  end
end

ExtractDiffLineInfo.for_one_diff(my_diff).all_line_num_starts
ExtractDiffLineInfo.for_many_diffs(@diffs).all_line_num_starts
这样传递:

class ExtractDiffLineInfo

  def initialize(*diffs)
    @diffs = diffs
  end

  def all_line_num_starts
    result = []
    @diffs.each do |diff|
      diff.body.lines.each do |diff_line|
        if (m = diff_line.match(/\A@@\s+\-(\d+),(\d+)\s+\+(\d+),(\d+)\s+@@/))
          a_start = m[1].to_i
          result << a_start + 3
        end
      end
    end
    result
  end
@diff_line_nums = ExtractDiffLineInfo.new(@diffs).all_line_num_starts
class ExtractDiffLineInfo

  def self.for_one_diff(diff)
    new([diff])
  end

  def self.for_many_diffs(diffs)
    new(diffs)
  end

  def initialize(*diffs)
    @diffs = diffs
  end
end

ExtractDiffLineInfo.for_one_diff(my_diff).all_line_num_starts
ExtractDiffLineInfo.for_many_diffs(@diffs).all_line_num_starts
这是我得到的错误:

NoMethodError at /rails/associations-rb/3cd4c7c0ffc3e00004a238304e903a140fcbcd67
undefined method `body' for #<Diff::ActiveRecord_Associations_CollectionProxy:0x007fc0628280c8>
奇怪的是,如果在运行时我
binding.pry
进入
initialize
方法并检查传入的
diff
参数,我会看到一个嵌套数组:

   4: def initialize(*diffs)
 => 5:   binding.pry
    6:   @diffs = diffs
    7: end

[1] pry(#<ExtractDiffLineInfo>)> diffs
=> [[#<Diff:0x007fc065d635a8
   id: 13645,
   body:
    "@@ -1856,7 +1856,7 @@ def destroy_associations\n             hm_options[k] = options[k] if options.key? k\n           end\n \n-          has_many name, scope, hm_options, &extension\n+          ActiveSupport::Deprecation.silence { has_many name, scope, hm_options, &extension }\n           _reflections[name.to_s].parent_reflection = habtm_reflection\n         end\n       end",
   commit_id: 1,
   author: "Ryuta Kamizono",
   author_gh_profile: "https://github.com/kamipo",
   author_gh_avatar: "https://avatars.githubusercontent.com/u/12642?v=3",
   commit_url: "https://github.com/rails/rails/commit/3cd4c7c0ffc3e00004a238304e903a140fcbcd67",
   commit_msg:
    "Suppress deprecation message to `has_and_belongs_to_many` only once\n\nPassing a class to `has_and_belongs_to_many` show deprecation message\nthree times. It is enough only once.",
   gh_sha: "3cd4c7c0ffc3e00004a238304e903a140fcbcd67",
   commit_date: Mon, 09 Jan 2017 20:00:53 UTC +00:00,
   created_at: Fri, 10 Mar 2017 08:33:38 UTC +00:00,
   updated_at: Fri, 10 Mar 2017 08:33:38 UTC +00:00,
   position: nil,
   num_additions: 2,
   num_deletions: 2,
   num_changes: 4,
   starting_line_num: 1859>,
  #<Diff:0x007fc05bf57c88
   id: 13644,
   body:
    "@@ -1827,7 +1827,7 @@ def has_and_belongs_to_many(name, scope = nil, **options, &extension)\n \n           builder = Builder::HasAndBelongsToMany.new name, self, options\n \n-          join_model = builder.through_model\n+          join_model = ActiveSupport::Deprecation.silence { builder.through_model }\n \n           const_set join_model.name, join_model\n           private_constant join_model.name\n",
   commit_id: 1,
   author: "Ryuta Kamizono",
   author_gh_profile: "https://github.com/kamipo",
   author_gh_avatar: "https://avatars.githubusercontent.com/u/12642?v=3",
   commit_url: "https://github.com/rails/rails/commit/3cd4c7c0ffc3e00004a238304e903a140fcbcd67",
   commit_msg:
    "Suppress deprecation message to `has_and_belongs_to_many` only once\n\nPassing a class to `has_and_belongs_to_many` show deprecation message\nthree times. It is enough only once.",
   gh_sha: "3cd4c7c0ffc3e00004a238304e903a140fcbcd67",
   commit_date: Mon, 09 Jan 2017 20:00:53 UTC +00:00,
   created_at: Fri, 10 Mar 2017 08:33:30 UTC +00:00,
   updated_at: Fri, 10 Mar 2017 08:33:30 UTC +00:00,
   position: nil,
   num_additions: 2,
   num_deletions: 2,
   num_changes: 4,
   starting_line_num: 1830>]]
4:def初始化(*diff)
=>5:binding.pry
6:@diff=diff
7:完
[1] 撬动(#)>差异
=> [[#,
#]]

是什么原因造成的?我该如何修复它?

这是因为您的splat

  def initialize(*diffs) # <- this one
    @diffs = diffs
  end
或展开初始值设定项中的数组

def initialize(*diffs)
  @diffs = @diffs.flatten # _should_ work on activerelations, didn't test.
end
如果我是你,我会放弃splat,放弃通过一个diff的能力


但我需要能够轻松地管理单个差异

你可以有专门的工厂方法。大概是这样的:

class ExtractDiffLineInfo

  def initialize(*diffs)
    @diffs = diffs
  end

  def all_line_num_starts
    result = []
    @diffs.each do |diff|
      diff.body.lines.each do |diff_line|
        if (m = diff_line.match(/\A@@\s+\-(\d+),(\d+)\s+\+(\d+),(\d+)\s+@@/))
          a_start = m[1].to_i
          result << a_start + 3
        end
      end
    end
    result
  end
@diff_line_nums = ExtractDiffLineInfo.new(@diffs).all_line_num_starts
class ExtractDiffLineInfo

  def self.for_one_diff(diff)
    new([diff])
  end

  def self.for_many_diffs(diffs)
    new(diffs)
  end

  def initialize(*diffs)
    @diffs = diffs
  end
end

ExtractDiffLineInfo.for_one_diff(my_diff).all_line_num_starts
ExtractDiffLineInfo.for_many_diffs(@diffs).all_line_num_starts

不过,我需要能够轻松管理单个差异。我找不到另一种方法。有时我确实需要处理单个差异,但我不希望有太多重复的代码…我已经有足够的代码了:(那么,按照我的回答做吧。这是一个很棒的实现,唯一的问题是,我不知道传递给该方法的
diff
是单数还是提前的集合,因为有一个关联与
diff
相关。如何将其修改为仅一个调用而不是两个不同的调用?@marca百万:之前的建议,扔掉垃圾。