Pregunta

Tengo una relación de uno a muchos en rieles:

class User < ActiveRecord::Base
  has_many :activities, :order => "added_at DESC"


class Activity < ActiveRecord::Base
  belongs_to :user

Tengo un método de Actividad:

def self.test_message(user, message)
  user.activities << Activity.create do |activity|
    activity.message = message
    activity.added_at = Time.now
  end    
end

y la prueba siguiente unidad:

require 'test_helper'

class ActivityTest < ActiveSupport::TestCase

  def test_test_message
    #From fixture
    alice = User.find_by_name("alice")
    assert_equal 0, alice.activities.count

    Activity.test_message(alice, "Hello")
    assert_equal 1, alice.activities.count

    Activity.test_message(alice, "Goodbye")
    assert_equal 2, alice.activities.count
    assert_equal "Hello", alice.activities.find(:first).message

    #The following line fails with: Goodbye expected but was Hello
    assert_equal "Goodbye", alice.activities.find(:last).message,
    acts = alice.activities
    assert_equal 2, acts.count
    assert_equal "Goodbye", acts[1].message
  end
end

, que se falla en la línea indicada, pero no puedo entender por qué.

Además, el uso activities.find (: pasado) funciona cuando se utiliza el entorno de desarrollo, pero sólo produce un error en el entorno de prueba. He caído y reconstruido la base de datos.

¿Fue útil?

Solución

Esto parece ser un problema con el uso de la bandera orden en su declaración de asociación. Este post no es la situación exacta que está experimentando, pero no recomienda la práctica en general:

http://weblog.jamisbuck.org/2007 / 1/18 / activerecord-asociación-de alcance-trampas

(no estoy seguro de si estas sugerencias son todavía relevantes, pero que estaba viendo el mismo comportamiento que usted en los carriles 2.3.3 hasta que hice los cambios a continuación.)

I fijó su aplicación a nivel local y trató de aplicar la técnica del comentario # 4 añadiendo

def Activity.by_added_at
  find :all, :order => 'added_at DESC'
end

y cambiando su hallazgo (: en primer lugar) y encontrar (: pasado). En la prueba de .by_added_at.first y .by_added_at.last, que devuelve resultados más estables

Otra sugerencia - la prueba es bastante grande en este momento. Podría considerar dividir a cabo en varias pruebas, cada una de las cuales pone a prueba una o dos condiciones como máximo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top