Rails STI获取父类而不是子类

时间:2015-09-09 08:52:28

标签: ruby-on-rails oop sti

这是我的代码:

  def data
    providers.map do |provider|
      binding.pry
      [
        ERB::Util.h(provider.id),
        link_to(raw(image_tag provider.avatar_url(:small), class: 'img-responsive'), admin_provider_path(provider))provider.enabled))
      ]
    end
  end

  def providers
    @providers ||= fetch_providers
  end

  def fetch_providers
    providers = Provider.order("#{sort_column} #{sort_direction}")
    providers = providers.page(page).per_page(per_page)
    if params[:sSearch].present?
      providers = providers.where("email like :search", search: "%#{params[:sSearch]}%")
    end
    providers
  end

我的问题是,我总是从provider.avatar_url(:small)得到零。在使用这样的pry调试此provider之后:

provider.class.name
=> "User"

我已将providers变量定义为Provider而非User

providers = Provider.order("#{sort_column} #{sort_direction}")

我无法获得"Provider"课程。当然,carrierwave将使用用户上传目录而不是提供商上传目录来搜索文件。我怎么得到这个?提前致谢

我的STI课程:

class Provider < User
  has_many :products
  after_create :assign_default_role
  mount_uploader :avatar, AvatarUploader

  def self.all
    User.with_role(:provider)
  end

  private

  def assign_default_role
    self.add_role "provider"
  end
end

1 个答案:

答案 0 :(得分:0)

如果您在表格中没有type列的情况下使用STI,则会发生这种情况。从数据库加载记录时,ActiveRecord正在使用该列中的信息来确定用于实例化对象的类。

要修复,您需要添加缺少的列,并为表示子类的每条记录填充Provider