【问题标题】:Rails association extension throws undefined methodRails 关联扩展抛出未定义的方法
【发布时间】:2016-02-06 13:58:46
【问题描述】:

我正在尝试创建一个 Active Record 匿名关联扩展,文档解释为 here。我有这个模型

class Program < ActiveRecord::Base
  has_many :reports do 
    def asdf
      "Hello extension"
    end
  end
end

class Report < ActiveRecord::Base
  belongs_to :program
end

但是当我在 rails c 控制台上测试这个时,我遇到了 undefined method 错误。

Loading development environment (Rails 4.2.5)
2.1.0 :001 > Program.first.reports.asdf
  Program Load (0.3ms)  SELECT  `programs`.* FROM `programs`  ORDER BY `programs`.`id` ASC LIMIT 1
NoMethodError:   Report Load (0.3ms)  SELECT `reports`.* FROM `reports` WHERE `reports`.`program_id` = 1
undefined method `asdf' for #<Report::ActiveRecord_Associations_CollectionProxy:0x000001035e0098>
    from /Users/mariowise/.rvm/gems/ruby-2.1.0/gems/activerecord-4.2.5/lib/active_record/relation/delegation.rb:136:in `method_missing'
    from /Users/mariowise/.rvm/gems/ruby-2.1.0/gems/activerecord-4.2.5/lib/active_record/relation/delegation.rb:99:in `method_missing'
    from (irb):1
    from /Users/mariowise/.rvm/gems/ruby-2.1.0/gems/railties-4.2.5/lib/rails/commands/console.rb:110:in `start'
    from /Users/mariowise/.rvm/gems/ruby-2.1.0/gems/railties-4.2.5/lib/rails/commands/console.rb:9:in `start'
    from /Users/mariowise/.rvm/gems/ruby-2.1.0/gems/railties-4.2.5/lib/rails/commands/commands_tasks.rb:68:in `console'
    from /Users/mariowise/.rvm/gems/ruby-2.1.0/gems/railties-4.2.5/lib/rails/commands/commands_tasks.rb:39:in `run_command!'
    from /Users/mariowise/.rvm/gems/ruby-2.1.0/gems/railties-4.2.5/lib/rails/commands.rb:17:in `<top (required)>'
    from bin/rails:4:in `require'
    from bin/rails:4:in `<main>'

我不想在许多关联之间共享相同的扩展,只是想通过匿名模块(块)来实现这一点。

有什么想法吗?

【问题讨论】:

  • 您是否尝试过在您的报告模型中定义 asdf 方法?
  • 进行此更改后您是否重新启动了 Rails 控制台?
  • 我尝试在报告模型中定义 asdf 方法,但它给了我同样的错误。我也重新启动了 rails 控制台(xD)
  • 你能用count 替换"Hello extension" 吗?回来报告 :) 停止弹簧,...重新启动控制台..
  • 是的,结果相同undefined method。我开始时正在尝试一些连接。

标签: ruby-on-rails ruby activerecord


【解决方案1】:

这是因为您检索了许多报告并在它们上调用了方法 asdf,而您的方法 asdf 是为单个报告定义的。

试试这个

  Program.first.reports.first.asdf 

【讨论】:

  • 是的。你是说这应该被称为Program.first.reports.first.asdf ??我也测试过那个案例..但它不应该是这样的(api.rubyonrails.org/classes/ActiveRecord/Associations/…
  • 否.. Program.first.reports.asdf 有效。见Association extensions
  • @mariowise,那么我认为您的方法 asdf 必须返回或过滤模型,而不仅仅是打印一些东西。尝试让它过滤并返回一些不一定有用但有效的东西。
  • 正如 Arup Rakshit 所说,我已经通过返回 count 进行了测试,这应该是有效的(对吗?)......问题仍然存在......
  • @mariowise 如果您没有待处理的迁移,那么我不知道。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-31
  • 1970-01-01
  • 2013-02-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多