Rails 3.2.8 - 在一个Rails应用程序中进行多个数据库访问

时间:2012-08-17 17:46:11

标签: sql-server database ruby-on-rails-3 activerecord

我正在构建一个拥有自己的数据库'products_db'的webapp。但是我的应用程序必须调用位于数据库'reviews_db'中的评论,这是另一个系统使用的遗留数据库,我无法做任何事情,因为客户端希望这样做。

所以,幸运的是,这两个db都位于同一个SQL Server(MSSQL)中。我已经有了'activerecord-sqlserver-adapter'工作,但我需要想办法从我的webapp访问'reviews_db'。

reviews_db不遵循任何Rails约定,因为它是遗留系统。

所以,我的班级产品:

class Product < ActiveRecord::Base
  attr_accessible :name, :description, :price

  has_many :reviews

end

我的班级评论:

class Review < ActiveRecord::Base

 # THIS CLASS DOESN'T FOLLOW RAILS CONVENTION
 # HOW DO I SET AND MANAGE LEGACY PRIMARY KEY?
 # HOW DO I CONNECT THIS MODEL TO THE OTHER DATABASE?
 # HOW DO I CONNECT THIS MODEL TO THE RIGHT TABLE NAME?

 attr_accessible :rv_tbl_title, :rv_tbl_id, :rv_tbl_text, :rv_tbl_author, :rv_tbl_ref_prod

 has_one :Product, foreign_key: :rv_tbl_author

end

它有宝石吗?在Review课程问题中使用的解决方案是什么?

1 个答案:

答案 0 :(得分:3)

我不确定这个第一部分是否必要,但是在你的database.yml文件中,通过添加这样的内容来建立新的连接:

review:
  adapter: sqlserver
  database: reviews_db
  .... put your other configuration info here

然后在你的评论模型review.rb:

class Review < ActiveRecord::Base
  establish_connection :review
  self.table_name = "review_table"
  self.primary_key = "review_id"
end

将表名更改为正确的表,将主键更改为正确的列名。

然后创建一个新的表/模型,其唯一目的是对审阅进行本地引用。所以你可以称之为ReviewReference

class ReviewReference < ActiveRecord::Base
  belongs_to :review
  has_one :product
end

将产品型号更改为

class Product < ActiveRecord::Base
  has_many :reviews, class_name: "ReviewReference"
end

这可以帮助您实现目标。你可能不得不做很多事情

@reviews = Review.where("some_column = ?", some_value)

@reviews = Review.find_by_sql("Some SQL Here")如果您正在进行更复杂的查询。

抱歉,我的回答并不是更具体,我只做了一次。乍得福勒的Rails食谱推荐这本概念。