使用alias_attribute测试关联

时间:2016-10-03 01:32:12

标签: ruby-on-rails activerecord rspec alias

我计划为我的几个模型关联使用别名属性。 注意:我完全清楚我也可以别名通过以下方式:

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

到目前为止一切顺利。我现在想在我的专辑规范中测试别名关联。即使在指定了类名后,传统的belongs_to搜索者似乎也不够聪明,无法识别类型 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 个答案:

答案 0 :(得分:2)

我不建议为此目的使用alias_attribute。据我所知,shoulda使用ActiveRecord::Reflection来调查关联。 alias_attribute唯一能做的就是通过getter,setter和&#39;?&#39;来创建从目标到源的代理消息的方法。方法。它显然是为了使用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方法以您真正想要的名称创建关联。