我有两种模式:
# /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
它完美无缺,没有“副作用”,我已经描述过了。