Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 是否可以使用联接表作为模型的基础?_Ruby On Rails_External Tables - Fatal编程技术网

Ruby on rails 是否可以使用联接表作为模型的基础?

Ruby on rails 是否可以使用联接表作为模型的基础?,ruby-on-rails,external-tables,Ruby On Rails,External Tables,在rails中将现有数据库表建模到我的模型时,我有哪些选项?我有一个has_one,属于两个表之间的关系,但我想将它们连接起来,并将其用作模型,只选择相关字段。由于这是一个外部表,我也希望尽量减少查询量 我正在继承一个现有的应用程序,不想从现有环境中接触任何东西,而是慢慢迁移。现有的数据库似乎与rails的方式有所不同。我有一个IdCard和IdCardRequest的模型。假设一张IdCard有许多IdCardRequests,但是该IdCard具有上一个IdCardRequest的属性。基本

在rails中将现有数据库表建模到我的模型时,我有哪些选项?我有一个has_one,属于两个表之间的关系,但我想将它们连接起来,并将其用作模型,只选择相关字段。由于这是一个外部表,我也希望尽量减少查询量

我正在继承一个现有的应用程序,不想从现有环境中接触任何东西,而是慢慢迁移。现有的数据库似乎与rails的方式有所不同。我有一个IdCard和IdCardRequest的模型。假设一张IdCard有许多IdCardRequests,但是该IdCard具有上一个IdCardRequest的属性。基本信息(如申请人姓名)似乎是IdCardRequest的属性,而不是IdCard的属性。幸运的是,它们都有一个共同的属性id\u卡号,我可以通过为id\u卡号指定外键和主键来加入它。但是现在我想要一个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.

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

e、 g


然后,您可以创建一个rails模型IdCardRequests,它将正常工作。您可以使其中一列成为视图中的主键,或者告诉模型使用self.primary_key=:my_key_column的其中一列

在过去,当我遇到类似情况时,我确实选择了代理选项。您可以在IdCard的属性上将代理包装成一个循环,这样就不必手动维护它们。这确实很有效。你会怎么做,比如通过身份证订购。首先。申请人姓?是的,这是限制,你失去了一些灵活性。当你想要的时候,你必须自己做水管。我不记得我们是如何处理这些问题的。也许你可以使用作用域来处理这些情况,这并不能真正解决问题,但至少隐藏了它?这也是我的思路。这将使我做事情更容易、更快。然而,我宁愿尽可能远离数据库。我可以为我的模型建立一个单独的数据库,并将视图放在从“未触及”数据库获取数据的位置吗?视图已经与表分开,创建视图不会影响数据,这是一种非常安全的方法,可以说比代理更整洁。创建视图不会破坏任何东西。如果我们可以创建生成views@IgNorand您可以让您的migrate执行sql命令。ActiveRecord::Migration.executeCREATE视图[名称]作为从中选择
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>