如何在不使用rails中的self.attribute =的情况下进行分配?

时间:2011-06-13 19:53:10

标签: ruby-on-rails ruby

SO,

我一直在研究这个问题,我发布了一个更大的问题没有得到任何回复,但我会在这里问一个更简单的问题。

我的问题是,在以下情况下,如何在不使用self.attribute =的情况下分配内容:

 def photo_from_url(url)
   remote_photo = open(url)
   def remote_photo.original_filename;base_uri.path.split('/').last; end
   **self.photo = remote_photo**
   self.save
 end

我需要让photo_from_url成为一个类方法,所以我可以从delayed_job中调用它,但是当我添加self时,它会给我“找不到方法photo =”。

请帮忙!提前谢谢......

2 个答案:

答案 0 :(得分:2)

根据定义,类方法不引用任何特定的对象实例。因此,您必须有办法获取要修改的对象。最简单的解决方案是将该对象的引用传递给您的类方法,并使用它而不是self

class Foo
  def self.photo_from_url(url, obj)
     ... 
     obj.photo = remote_photo
     ...
  end
end

使用示例:

foo = Foo.new # creates a new instance of Foo
Foo.photo_from_url("http://example.com/photo/12341", foo)

请注意我如何将photo_from_url作为类方法调用?这是因为它在Foo类上运行,而不是Foo的实例,恰好是foo


以下是一些关于类和实例方法之间差异的文献:

Class and Instance Methods in Ruby

答案 1 :(得分:2)

选项1:每次调用此方法时都要创建新对象:

class Photo < ActiveRecord::Base
  def self.photo_from_url(url)
    ...

    new(:photo => remote_photo).save!
  end
end

选项2:您想要更新现有对象,然后需要获取要修改的对象ID:

class Photo < ActiveRecord::Base
  def self.photo_from_url(url)
    ...

    id = # here you find id, e.g. from url 
    find(id).update_attributes!(:photo => remote_photo)
  end
end