我在Rails中使用ActiveResource来管理基于REST的单独数据库中的实体。

我一直在尝试显式管理远程资源的ID,因为在当前情况下,最简单的方法就是重新使用本地资源的ID,而不是维护不同的字段。

不幸的是,由于 ActiveResource :: Base 中的 new?的代码是

,我无法解决这个问题。
  def new?
    id.nil?
  end

save

 def save
   new? ? create : update
 end

因此,根据定义,无法设置资源的ID并将其另存为新资源。

create update 是受保护的方法,所以如果我攻击ActiveResource :: Base代码可能会使它工作,但我不愿意这样做。

有没有正确的方法呢?或者我正在尝试做的只是坏事,我不应该这样做?

有帮助吗?

解决方案

你正在反对ActiveResource的意图。 ActiveResource为REST Web服务提供了一个接口,按照惯例,在您进行创建时返回分配的ID。

也就是说,如果您控制正在使用的资源,并且在保存新记录时修改了其行为以获取ID,则可以修改ActiveResource :: Base以符合要求。 Rails中的人们对基类进行添加和更改的情况并不少见;你只需将你的补丁放在lib中,并把它包含在你的启动内容中。

我认为这不是一个好主意,但它是可能的。 :)

其他提示

在新的rails(测试版2.3.2)中可以设置id,因为保存逻辑已经改变了一点(现在记录有布尔字段@newrecord来消除id.nil?)。

record = Model.new
record.id = 123
record.save!
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top