我在Rails中使用ActiveResource来管理基于REST的单独数据库中的实体。
我一直在尝试显式管理远程资源的ID,因为在当前情况下,最简单的方法就是重新使用本地资源的ID,而不是维护不同的字段。
很遗憾,由于new?
中ActiveResource::Base
的代码
def new?
id.nil?
end
和save
是
def save
new? ? create : update
end
因此,根据定义,无法设置资源的ID并将其另存为新资源。
create
和update
是受保护的方法,所以如果我攻击ActiveResource :: Base代码可能会使它工作,但我不愿意这样做。
有没有正确的方法呢?或者我正在尝试做的只是坏事,我不应该这样做?
答案 0 :(得分:4)
在新的rails(测试版2.3.2)中可以设置id,因为保存逻辑已经改变了一点(现在记录有布尔字段@newrecord来消除id.nil?)。
record = Model.new
record.id = 123
record.save!
答案 1 :(得分:2)
你正在反对ActiveResource的意图。 ActiveResource为REST Web服务提供了一个接口,按照惯例,在您进行创建时返回分配的ID。
也就是说,如果您控制正在使用的资源,并且在保存新记录时修改了其行为以获取ID,则可以修改ActiveResource :: Base以符合要求。 Rails中的人们对基类进行添加和更改的情况并不少见;你只需将你的补丁放在lib中,并把它包含在你的启动内容中。
我认为这不是一个好主意,但它是可能的。 :)