如何简化关联名称?

时间:2015-01-21 14:01:35

标签: ruby-on-rails associations rails-activerecord

我有两种模式:

# /app/models/service_user.rb
class ServiceUser < ActiveRecord::Base
  has_many :service_user_images
end

# /app/models/service_user_image.rb
class ServiceUserImage < ActiveRecord::Base
  belongs_to :service_user
end

当我想要为服务用户获取所有图像时,我需要调用:

@service_user.service_user_images
#^^^^^^^^^^^^^^^^^^^^^^^^^

如何为ServiceUser模型完全简化名称'service_user_images'到'images'?我应该这样做吗?对于ActiveRecord,“service_user.service_user_xxxs”这样的调用是否正常?

现在我看到三个解决方案:

1)使用':class_name'选项,但我认为这是我的代码的开销,如果我有一些关联,它将使代码更脏

2)使用方法别名,但我不认为这是一个很好的解决方案,因为ActiveRecord为每个关联创建多个方法,我将被迫使用太多别名

3)使用像'ServiceUser :: Image'这样的嵌套类,但是它会产生另一个困难,例如我需要在每个工厂中定义这个类的名称(我使用FactoryGirl),因为它会翻译像':service_user_image这样的名称默认情况下'''ServiceUserImage':

FactoryGirl.define do
  factory :service_user_image do |image| # works for ServiceUserImage model, does not work for ServiceUser::Image model
    # ...
  end

  factory :service_user_image, class: ServiceUser::Image do |image| # works for ServiceUser::Image model
    # ...
  end
end

理想情况下,我搜索的解决方案如下:

class ServiceUser < ActiveRecord::Base
  has_many :service_user_images, alias: :images # JUST EXAMPLE! DO NOT USE THIS!
end

现在我找到了解决方案:

class ServiceUser < ActiveRecord::Base
  has_many :service_user_images

  alias_attribute :images, :service_user_images
end

它完美无缺,没有“副作用”,我已经描述过了。

0 个答案:

没有答案