2

我正在构建一个具有自己的名为“products_db”的数据库的 web 应用程序。但是我的应用程序将不得不调用位于数据库“reviews_db”中的评论,这是另一个系统正在使用的遗留数据库,我无法做任何事情,因为客户希望这样。

因此,幸运的是,两个数据库都位于同一个 SQL Server (MSSQL) 中。我已经让 te '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

有宝石吗?在复习课问题中使用什么解决方案?

4

1 回答 1

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")如果您正在执行更复杂的查询。

抱歉,我的回答不够具体,我只做过一次。支持 Chad Fowler 的 Rails 食谱书的概念。

于 2012-08-17T21:30:58.690 回答