我刚刚学习RoR,并试图围绕我的遗留数据库构建模型,该模型是围绕用于查询数据的SPROC构建的。我找到了activerecord-tableless宝石,并用它来帮助建立模型。Ruby on Rails与传统数据库的无表模型关联
到目前为止,我能够得到示范基地工作确定:
class Wine < ActiveRecord::Base
has_no_table
self.primary_key = "iWine"
column :iWine, :integer
column :Wine, :string
column :Vintage, :integer
....etc......
attr_accessible :iWine, :Wine, :Vintage, .....
has_many :labelImages
def self.find_wine(id)
r = ActiveRecord::Base.execute_procedure "sp_FetchWineVerbose", 'iWine' => id.to_i
if r.size > 0
w = Wine.new(r[0])
return w;
end
end
end
现在,我想利用的ActiveRecord协会的相关数据,例如附加件拉标签图像,其他年份等。这是我到目前为止有:
class LabelImage < ActiveRecord::Base
has_no_table
column :id, :integer
column :width, :integer
column :height, :integer
column :wine_id, :integer
attr_accessible :id, :width, :height, :wine_id
after_initialize :fetch_data
belongs_to :wine
def fetch_data()
sql = <<-eos
SELECT iLabel AS id, Width AS width, Height AS height, ....
eos
r = ActiveRecord::Base.connection.select_all(sql, 'Label Image', [[wine_id,wine_id]])
if r.size > 0
self.assign_attributes(r[0])
end
end
end
所以,现在,我可以打电话w = Wine.find_wine(1)
然后w.labelImages.build
,和我回去用正确的数据LabelImage对象。但是,我也在控制台中收到以下消息:
Could not log "sql.active_record" event. NoMethodError: undefined method `name' for 1:Fixnum
我试过挖掘源代码,但无法弄清楚这是从哪里来的。而且,我也无法弄清楚如何覆盖初始化以返回一个包含多个LabelImage对象的数组 - 因为对于任何给定的葡萄酒可能会有很多。我应该重写build
方法(如果是这样,如何?),还是有另一种方法来创建对象,然后将它们分配给Wine.labelImages属性?
是的,我可能正在努力解决这个问题:)我还没有找到任何看起来与我想要的相似的好教程/示例,所以我一直试图修改'标准'方法。我会看看'rmre',感谢指针!但是,我没有看到一个明显的方法来插入我的存储过程(SPROC)来获取数据而不是ActiveRecord生成的SQL?对此有何想法? – Dan 2013-03-15 20:16:49
模式有多复杂?如果它实际上是葡萄酒和葡萄酒标签,看起来存储过程似乎有点过分。 'ActiveRecord'将允许你做所有你需要的查询。如果你可以使用像Visio这样的东西来生成ER图?我可以进一步建议。 – hwatkins 2013-03-15 20:27:08
该模式非常复杂;我只是想简化成一个易于消化的具体例子。我们有大约160个不同的表格(不包括视图),并且大量数据是动态的并且依赖于用户的请求 - 所以即使是“简单”查询也可能涉及大量JOIN。对于我们来说,将大量逻辑推送到数据库并仅使用SPROC作为查询/更新数据的接口会更有效率。 (另外,我们有一个现有的ASP/VBScript前端需要继续存在。) – Dan 2013-03-15 20:41:00