2013-03-15 76 views
0

我刚刚学习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属性?

回答

1

您可能正在努力解决这个难题,activerecord-tableless宝石确实是针对未存储在SQL数据库中的信息。

我建议看看类似https://rubygems.org/gems/rmre的东西,它可以帮助您基于您现有的模式构建active_models。

+0

是的,我可能正在努力解决这个问题:)我还没有找到任何看起来与我想要的相似的好教程/示例,所以我一直试图修改'标准'方法。我会看看'rmre',感谢指针!但是,我没有看到一个明显的方法来插入我的存储过程(SPROC)来获取数据而不是ActiveRecord生成的SQL?对此有何想法? – Dan 2013-03-15 20:16:49

+0

模式有多复杂?如果它实际上是葡萄酒和葡萄酒标签,看起来存储过程似乎有点过分。 'ActiveRecord'将允许你做所有你需要的查询。如果你可以使用像Visio这样的东西来生成ER图?我可以进一步建议。 – hwatkins 2013-03-15 20:27:08

+0

该模式非常复杂;我只是想简化成一个易于消化的具体例子。我们有大约160个不同的表格(不包括视图),并且大量数据是动态的并且依赖于用户的请求 - 所以即使是“简单”查询也可能涉及大量JOIN。对于我们来说,将大量逻辑推送到数据库并仅使用SPROC作为查询/更新数据的接口会更有效率。 (另外,我们有一个现有的ASP/VBScript前端需要继续存在。) – Dan 2013-03-15 20:41:00