0

Основные настройки ассоциации (примечание, клиент является продолжением модели Person):настраиваемую область не возвращает никаких результатов

Customer has_many :orders 
Order belongs_to :customer 

Внутри Customer.rb, у меня есть следующий метод класса:

# SCOPE 
def self.ordered_in_90_days 
    joins(:orders).where('orders.created_at > ?', 90.days.ago) 
end 

В моем тесте у меня есть следующий код, который создает новый заказ (автоматически создавая клиент для FactoryGirl), а затем использует собственный метод модели клиента, определенный выше:

it "finds customers who have ordered within the last 90 days" do 
    @order  = FactoryGirl.create(:order, created_at: 50.days.ago) 
    @customer = @order.customer 

    Customer.count.should == 1 #passes 
    Order.count.should == 1  #passes 

    puts Customer.all.to_yaml #for debugging, see below 
    puts Order.all.to_yaml  #for debugging, see below 

    Customer.ordered_in_90_days.should == [@customer] #fails! returns: [] 
end 

Создаются заказчик и заказ, но ничего не возвращается в вызове метода (пустой массив). Что мне не хватает?

Вот некоторая дополнительная информация о заводах:

FactoryGirl.define do 
    factory :customer do 
     first_name "Wes" 
     last_name "Foster" 
     type "Customer" 
    end 

    factory :order do 
     customer 
    end 
end 

А вот выход отладки для Клиента и порядка (помните, клиент является продолжением лица, так вот почему вы видите person_id вместо Customer_ID) :

--- 
- !ruby/object:Customer 
    attributes: 
    id: 1 
    first_name: Wes 
    last_name: Foster 
    type: Customer 
    created_at: 2013-09-16 21:54:26.162851000 Z 
    updated_at: 2013-09-16 21:54:26.162851000 Z 
    middle_name: 
--- 
- !ruby/object:Order 
    attributes: 
    id: 1 
    person_id: 
    created_at: 2013-07-28 21:54:26.135748000 Z 
    updated_at: 2013-09-16 21:54:26.192877000 Z 

(Заказчик

+0

Попробуйте поместить инструкцию отладчика в начале этого тестового примера, затем пройдите тест и проверьте все связанные объекты, чтобы убедиться, что их атрибуты точно такие, как вы ожидаете. Вы уверены, что получаете точно правильный заказ, клиент и created_at? –

+0

Кроме того, возможно, разместите свой завод для заказа, чтобы мы могли видеть этот код. –

+0

Я не вижу ничего плохого в методе/области класса. Я пробовал аналогичную область с некоторыми моделями в одном из моих приложений, и он работал нормально. –

ответ

1

Вывод отладки указывает на проблему, на самом деле Посмотрите на Приказа осмотр: у вас есть ре rson_id blank.

Во-первых, даже если Клиент является подклассом/продление Person, Орден belongs_to :customer говорит ActiveRecord искать customer_id, не person_id. Указываете ли вы, что ассоциация должна быть настроена не по умолчанию в модели заказа?

В противном случае, я думаю, что вы можете ошибочно ссылаться на ссылку с псевдонимом ассоциации на фабрике заказов. Я не использовал ссылки на псевдонимы ассоциации factory_girl в своем проекте - я стараюсь поддерживать ассоциации из своих заводов, но я бы проверял вашу методологию с документацией factory_girl: Association Aliases.

Я, лично, попробовать это в тестовом примере:

it "finds customers who have ordered within the last 90 days" do 
    @customer = FactoryGirl.create(:customer) 
    @order  = FactoryGirl.create(:order, created_at: 50.days.ago, customer: @customer) 

    Customer.count.should == 1 
    Order.count.should == 1  

    Customer.ordered_in_90_days.should == [@customer] 
end 

Установка @ order.customer явно в ваших примерах позволяет устранить зависимость фабрики и сложности.

Sidenote
Если вы хотите сохранить метод псевдонима ассоциации в вашей фабрике, и полагаться на этой ассоциации в других тестах, я предложил бы писать отдельный тест, чтобы убедиться, что фабричные отношения инстанцирования правильно:

@order = create(:order) 
expect(@order.customer).to be_a(Customer) 

Или что-то в этом роде ...

+0

Спасибо Карлос. Да, у меня был атрибут 'foreign_key', назначенный для моделей Order и Customer. Проблема, похоже, связана с тем, что FactoryGirl не связывает Заказ и Заказчик при создании заказа. Не могу поверить, что я пропустил это в ямле! Вы указали мне в правильном направлении, и я переупорядочил создание моего заказа и клиента, как вы предложили. Кажется, теперь все работает гладко. И спасибо за отзыв о тестировании ассоциации клиентов/заказчиков. Наконец, в этой ситуации нет необходимости использовать псевдонимы FactoryGirl. Благодаря! –

+0

Отлично, рад, что я мог бы помочь! Я оценил возможность обновить свои знания FactoryGirl. –

Смежные вопросы