Ruby on rails 如何在rails中不使用self.attribute=进行分配?

Ruby on rails 如何在rails中不使用self.attribute=进行分配?,ruby-on-rails,ruby,Ruby On Rails,Ruby,所以 我已经做了一段时间了,我发布了一个更大的问题,没有得到任何回复,但我会在这里问一个更简单的问题 我的问题是,在以下上下文中,如何在不使用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_p

所以

我已经做了一段时间了,我发布了一个更大的问题,没有得到任何回复,但我会在这里问一个更简单的问题

我的问题是,在以下上下文中,如何在不使用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成为一个类方法,这样我就可以从延迟的_作业调用它,但是当我添加self时,它会给我“no method found photo=”


请帮忙!提前感谢…

根据定义,类方法不引用任何特定的对象实例。因此,必须有一种方法来获取要修改的对象。最简单的解决方案是将该对象的引用传递到类方法中,并使用它而不是
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)
注意我是如何从_url调用
photo_作为类方法的吗?这是因为它在
Foo
类上运行,而不是
Foo
的实例,这里正好是
Foo


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


根据定义,类方法不引用任何特定的对象实例。因此,必须有一种方法来获取要修改的对象。最简单的解决方案是将该对象的引用传递到类方法中,并使用它而不是
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)
注意我是如何从_url
调用
photo_作为类方法的吗?这是因为它在
Foo
类上运行,而不是
Foo
的实例,这里正好是
Foo


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


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

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

    new(:photo => remote_photo).save!
  end
end
class-Photo远程照片)。保存!
终止
终止
选项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
class-Photo远程照片)
终止
终止

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

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

    new(:photo => remote_photo).save!
  end
end
class-Photo远程照片)。保存!
终止
终止
选项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
class-Photo远程照片)
终止
终止

嘿,杰里米-谢谢你回复我。你的建议看起来是可行的,但我有一个问题(这里是业余程序员)。你通过什么去obj?可能是ID?包含要设置的
photo
属性的对象实例。我将在我的答案中添加一个示例使用场景。什么是通过obj的点?如果你知道,你可能应该使用实例方法。嗨,杰里米,谢谢你的帮助。和胜利者的答案一起运行,因为它是最直接的,并且最适合我现有的代码。非常感谢你的投入。我会读那些材料的@维克多:我只是从一般的角度来看,而不是从ActiveRecord的角度来看。我的错。嘿,杰里米-谢谢你回复我。你的建议看起来是可行的,但我有一个问题(这里是业余程序员)。你通过什么去obj?可能是ID?包含要设置的
photo
属性的对象实例。我将在我的答案中添加一个示例使用场景。什么是通过obj的点?如果你知道,你可能应该使用实例方法。嗨,杰里米,谢谢你的帮助。和胜利者的答案一起运行,因为它是最直接的,并且最适合我现有的代码。非常感谢你的投入。我会读那些材料的@维克多:我只是从一般的角度来看,而不是从ActiveRecord的角度来看。我的错,维克多,你绝对是救命恩人。这起作用了。万分感谢你。维克多,你真是个救命恩人。这起作用了。非常感谢你。