可以使用联接表作为模型的基础吗?

时间:2019-01-17 10:01:21

标签: ruby-on-rails external-tables

在rails中将现有数据库表成型为模型有哪些选择?我在两个表之间具有has_one和belongs_to关系,但我想将它们联接起来并用作模型(并仅选择相关的字段)。由于这是一个外部表,因此我也希望尽量减少查询量。

我正在继承现有的应用程序,并且希望不接触现有环境中的任何内容并慢慢迁移。现有的数据库似乎与Rails的方法有所不同。我有一个IdCard和IdCardRequest模型。可以假定一个IdCard具有多个IdCardRequests,但是IdCard具有最后一个IdCardRequest的属性。似乎基本信息(例如applicant_name)是IdCardRequest的属性,而不是IdCard。幸运的是,它们都有一个共同的属性id_card_number,我可以通过在id_card_number中指定foreign_key和primary_key来加入它。但是,现在我想要一个IdCard模型,并将IdCardRequest的其余字段作为属性。

    class IdCard < ExternalTable
      self.table_name = 'id_cards'
      belongs_to :security_id_request, :foreign_key => 'request_id'
      default_scope { includes(:id_request) }
    end
    class IdRequest < ExternalTable
      self.table_name = 'id_request'
      has_one :id_card, :foreign_key => 'request_id'
    end
    # I would like IdCard.first.applicant_lastname
    # I have to call IdCard.first.id_request.applicant_lastname
    # I have to call IdCard.first.id_request.applicant_firstname
    # I could write a delegate_to for every property, but this seems cumbersome and inefficient.

1 个答案:

答案 0 :(得分:1)

您是否可以选择创建一个数据库视图来封装两个表,并将列重命名为Rails约定?

例如

create view id_card_requests as 
select 
  existing_column as desired_rails_column_name,
  ... 
from id_cards 
join id_card_requests on <whatever the join is>

然后,您可以制作将正常运行的Rails模型IdCardRequests。您可以将其中一列设为视图中的主键,或者告诉模型使用self.primary_key = :my_key_column

中的一列