Ruby on Rails与传统数据库的无表格模型关联

时间:2013-03-15 18:27:49

标签: ruby-on-rails activerecord

我正在学习RoR,并且正在尝试围绕我的遗留数据库构建一个模型,该数据库是围绕SPROC构建的,用于查询数据。我找到了activerecord-tableless宝石并使用它来帮助构建模型。

到目前为止,我能够让基本模型运行正常:

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 个答案:

答案 0 :(得分:1)

您可能正在努力解决这个问题,activerecord-tableless gem实际上是用于未存储在SQL数据库中的信息。

我建议您查看https://rubygems.org/gems/rmre之类的内容,以帮助您根据现有架构构建active_model。