【问题标题】:Rails 4 "becomes" issueRails 4“成为”问题
【发布时间】:2014-06-17 16:49:58
【问题描述】:

我有一个应用程序正在使用becomes 方法将一个对象转换为另一个对象。编码资产应该变成EncodedImage,但它没有正确保存,EncodedImage 数组保持空白。虽然它看起来好像正在保存,但实际上并没有将数据存储在 EncodedImage 对象中。 我有以下代码:

class EncodedAsset < Asset
  serialize :files
  serialize :linked_files
  serialize :linked_files_cache

  belongs_to :video, :foreign_key => :asset_id

  scope :ordered, -> { order("extname ASC, bitrate ASC") }
  scope :mp4s, -> { where(:extname => '.mp4')}
  scope :m3u8s, -> { where(:extname => '.m3u8')}

  validates_presence_of :asset_id

  before_create :set_type

  def get_url(file)
    Saas::Config.primary_s3_bucket_url + file
  end

  protected
    def set_type
      case profile_name
      when 'thumbnail'
        self.becomes(EncodedImage)
      else
        self.becomes(EncodedVideo)
      end
    end

    def is_hls?
      extname.include?('.m3u8')
    end
end

上传缩略图后,当 EncodedAsset 类型应变为 EncodedImage 时,EncodedAsset 类型仍保持为 EncodedAsset。

我做错了什么?

【问题讨论】:

  • self.becomes(EncodedImage) 应该返回具有当前 EncodedAsset 属性的 EncodedImage 实例...我认为它实际上不会将当前 EncodedAsset 转换为 EncodedImage...我不t 真正使用变得虽然,所以我对它的使用不是很清楚
  • 您不能按照自己的意愿就地改变对象类。您将只能基于此返回一个不同的对象。

标签: ruby-on-rails ruby-on-rails-4 assets


【解决方案1】:

【讨论】:

  • becomes! 不能解决这个问题。在这种情况下,爆炸声 ! 表示它还操纵了 type 属性,而不是它改变了对象。
  • 引用文档 from become!:注意:旧实例的 sti 列值也会更改,因为两个对象共享同一组属性。
  • 是的,类型列会改变,但对象的实际类不会。
  • 查看您链接到的文档中链接的源代码。它使用正确的类创建一个新实例,并复制属性。对于! 版本,它会改变type 属性。原始实例保持不变,并且始终具有实例化类型。 Ruby 语言不支持此功能。见:stackoverflow.com/questions/7528552/…
  • 你是对的。但既然他说保存后,这对我来说意味着重新加载,然后它就会有正确的类。
猜你喜欢
  • 2015-02-11
  • 2023-03-16
  • 1970-01-01
  • 1970-01-01
  • 2015-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多