如何使两个不同的ActiveResource模型使用两个不同的连接对象?

时间:2011-03-15 22:14:01

标签: ruby-on-rails json format activeresource

原样,共享ActiveResource模型之间的连接。因此,如果您在一个模型中设置格式, 与其他模型中的格式保持不同。但是,如果您在两个单独的模型上调用.connection.format方法,则每次设置新格式时该格式都会更改。因此,如果Profile:json格式加载到第二位,那么两个模型的.connection.format将变为ActiveResource::Formats::JsonFormat

我原来的问题完全不同(我没有完全理解发生了什么) - 您可以查看编辑历史记录以查看原始版本。希望我会得到更多回复...

证明:

class Location < ActiveResource::Base
  self.format = :xml
end

class Profile < ActiveResource::Base
  self.format = :json
end

然后在rails console ...

>> Location.format
=> ActiveResource::Formats::XmlFormat
>> Location.connection.format
=> ActiveResource::Formats::XmlFormat

到目前为止一切都很好...... Location模型及其连接的格式正确。

>> Profile.format
=> ActiveResource::Formats::JsonFormat

看起来很正常,这是我想要的Profile格式。

>> Location.format
=> ActiveResource::Formats::XmlFormat

Ok ...加载Profile模型后,Location.format仍然相同 注意:这些模型是延迟加载的,因此在您尝试调用类名之前,它们的文件和代码不会包含在内。

>> Location.connection.format
=> ActiveResource::Formats::JsonFormat

这里的问题就开始了。在我们调用了Profile模型之后,它开始了Location.connection.format

>> Profile.connection.format
=> ActiveResource::Formats::JsonFormat

格式应该是相同的。当你调用Location.find(:all,:from =&gt;“/ something.xml”)时,这会导致解析完全被破坏 - 它会尝试将xml解析为{{1} }

我想我现在的问题是 - 如何分开两个连接? (或以其他方式解决此问题)

编辑以在控制台中添加此测试:

json

1 个答案:

答案 0 :(得分:1)

这......感觉就像一个错误。

我在查看ActiveResource源代码。当您在ARes类中调用format=方法时,它会将格式写入connection.format

如果已定义,则此上下文中的connection方法会抓取@@connection,否则会调用superclass.connection。在我们的案例中,superclassActiveResource::Base。您可以猜测,@@connectionLocation模型上的Profile未定义。如果您在课堂上致电self.site= 会被设置,在这种情况下,self.format=方法会在connection的特定于班级的版本上设置格式对象

在我的情况下,我没有理由为不同的ActiveResource模型使用不同的站点变量,只是一种不同的返回格式。出于这个原因,我在开发中设置ActiveResource::Base.site = "myresource.local"(以及生产.rb env文件中的相应文件)。

所以我解决了这个问题?

class Location < ActiveResource::Base
  self.site = self.site
  self.format = :xml
end

是的,self.site = self.site强制类使用它自己的连接对象。不知怎的,我觉得self.format =也应该......

不会接受这个答案,因为它感觉像是一个黑客和/或错误,但这就是我现在解决它的方式,似乎工作。

希望其他人有这方面的想法?似乎很多人都没有使用ActiveResource,但我们每天都使用它,而且我之前遇到过这种情况。