我在编写用于ActiveRecord对象集合的类方法时遇到了麻烦.我在最近几个小时内遇到过这个问题两次,这似乎是一个简单的问题,所以我知道我错过了一些东西,但我无法在其他地方找到答案.
例:
class Order < ActiveRecord::Base
belongs_to :customer
scope :month, -> { where('order_date > ?', DateTime.now.beginning_of_month.utc) }
def self.first_order_count
map(&:first_for_customer?).count(true)
end
def first_for_customer?
self == customer.orders.first
# this self == bit seems awkward, but that's a separate question...
end
end
Run Code Online (Sandbox Code Playgroud)
如果我打电话Order.month.first_order_count,我会
NoMethodError: undefined method 'map' for #<Class:...
据我所知,那是因为map不能直接调用Order,而是需要一个Enumerable对象.如果我打电话Order.year.map(&:first_for_customer?).count(true),我会得到理想的结果.
编写用于ActiveRecord对象集合的方法的正确方法是什么,而不是直接在类上?
所有的独角兽工人都在默默地死去,没有任何原因的迹象,而且我找不到任何外部过程杀死他们的证据。我是刚开始诊断这类问题的人,经过数小时的研究,实验并试图弄清楚这一点,我已经走到了尽头。
背景信息-它是一个Rails 4.1应用程序,Ruby 2.0,在Ubuntu 14.04服务器上运行nginx和unicorn。
独角兽
working_directory "/home/deployer/apps/ourapp/current"
pid "/home/deployer/apps/ourapp/current/tmp/pids/unicorn.pid"
stderr_path "/home/deployer/apps/ourapp/current/log/unicorn.log"
stdout_path "/home/deployer/apps/ourapp/current/log/unicorn.log"
listen "/tmp/unicorn.ourapp.sock"
worker_processes 2
timeout 30
Run Code Online (Sandbox Code Playgroud)
摘自unicorn.log(死前和重启后的最后几行)
I, [2016-08-28T19:54:01.685757 #19559] INFO -- : worker=1 ready
I, [2016-08-28T19:54:01.817464 #19556] INFO -- : worker=0 ready
I, [2016-08-29T09:19:14.818267 #30343] INFO -- : unlinking existing socket=/tmp/unicorn.ourapp.sock
I, [2016-08-29T09:19:14.818639 #30343] INFO -- : listening on addr=/tmp/unicorn.ourapp.sock fd=10
I, [2016-08-29T09:19:14.818807 #30343] INFO -- : worker=0 spawning...
I, [2016-08-29T09:19:14.824358 #30343] INFO -- : worker=1 spawning...
Run Code Online (Sandbox Code Playgroud)
一些相关信息:
/var/log被杀死进程的证据,只能找到几天前被杀死的一个不相关进程。 最终编辑:
感谢@PeterAlfvin 建议我专注于应用程序布局和标题,我能够修复它。我无法确切地弄清楚问题是什么,但标题中的某些内容导致水豚无法“看到”页面的其余部分。我删除了<%= render 'layouts/header' %>,重新构建了内部的标头application.html.erb,一旦它开始工作,将其拉出到部分并替换渲染语句。我摆弄了旧的和新的头文件来尝试找出问题,但还没有成功。这使得我的测试看起来有点脆弱,但如果问题再次出现,至少我会知道去哪里寻找。
编辑:如果您倾向于投反对票,请继续,但让我知道我忽略或未能研究的内容,因为您的评论可能会帮助我弄清楚这一点。
我已经搜索了几个小时试图解决这个问题,但我不知道发生了什么。我确信我错过了一些简单的东西,对于那些最后一天没有盯着它看的人来说,这些东西是显而易见的。无论如何,这就是我的希望。
我的所有 Rspec/capybara 请求规范都失败了,但是当我在浏览器中查看页面时,规范无法找到的所有元素都明显存在。据我所知,水豚没有看到整个页面 - save_and_open_page 返回一个几乎空白的页面。我在下面的规范中看到的失败是普遍的 - 规范可以看到页面标题,但看不到页面正文中的任何内容。我相当有信心我的所有路线都很好,因为所有标题测试都在应该通过的时候通过。
规格/请求/static_pages_spec.rb
require 'spec_helper'
describe "StaticPages" do
subject { page }
describe "About page" do
before { visit about_path }
it { save_and_open_page;
should have_selector('title', text: 'Company Name | About') }
it { should have_selector('h1', text: 'About stuff') }
it { should have_content('About paragraph') }
end
#more specs...
end
Run Code Online (Sandbox Code Playgroud)
结果:
5) StaticPages About page
Failure/Error: it { should have_selector('h1', text: 'About …Run Code Online (Sandbox Code Playgroud)