2016-10-03 5 views
3

Я планирую использовать атрибуты псевдонимов для нескольких моих ассоциаций моделей. Примечание: Я полностью в курсе, что я могу также псевдоним это объединение с помощью:Тестирование ассоциации с alias_attribute

belongs_to :type, class_name: "AlbumType" 

, но хотел бы продолжить изучение метода alias_attribute. Имея это в виду, у меня есть Album, который принадлежит AlbumType.

class Album < ApplicationRecord 
    alias_attribute :type, :album_type 
    belongs_to :album_type 
end 

class AlbumType < ApplicationRecord 
    has_many :albums 
end 

Пока все хорошо. Теперь я бы хотел протестировать aliased-ассоциацию в своем альбоме. Похоже, что традиционный belongs_to musta-matcher недостаточно умен, чтобы определить, что тип является album_type, даже после указания названия класса. Я, конечно, не против написания традиционного теста RSpec, но не совсем уверен, как в этом случае. Любая помощь приветствуется.

RSpec.describe Album, type: :model do 
    describe "ActiveRecord associations" do 
    it { should belong_to(:album_type) } 

    context "alias attributes" do 
     it { should belong_to(:type).class_name("AlbumType") } 
    end 
    end 
end 

ответ

1

Я бы не рекомендовал использовать для этой цели alias_attribute. Насколько мне известно, shoulda использует ActiveRecord::Reflection для изучения ассоциаций. Единственное, что делает alias_attribute, - это создавать методы для прокси-сообщений от цели до источника через getter, setter и '?' методы. Он был явно предназначен для работы с атрибутами ActiveRecord, а не с методами общего назначения.

Эффект от этого заключается в том, что alias_attribute не зарегистрирует эти цели как ассоциации ActiveRecord, и текущая реализация shoulda не сможет их поймать.

Есть также побочные эффекты для этого рисунка. Как вы, возможно, знаете, при создании ассоциации ActiveRecord также создает вспомогательные методы, облегчающие вашу жизнь. Например, belongs_to также создает:

build_association(attributes = {}) 
create_association(attributes = {}) 
create_association!(attributes = {}) 

По вашему примеру, с помощью alias_attribute не даст вам album.build_album_type и это то, что другие участники могут быть готовы полагаться на, как они ожидают, что будет по умолчанию.

Лучший способ справиться с этим - это то, что вы сказали, что не хотите делать, используя метод belongs_to, чтобы создать ассоциацию под именем, которое вы действительно хотите.

+0

Спасибо, что поняли, что для меня. В настоящее время в процессе настройки моих сериализаторов ActiveModel это произошло в самый последний момент. –

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