Ruby on rails 是否可以使用联接表作为模型的基础?
在rails中将现有数据库表建模到我的模型时,我有哪些选项?我有一个has_one,属于两个表之间的关系,但我想将它们连接起来,并将其用作模型,只选择相关字段。由于这是一个外部表,我也希望尽量减少查询量 我正在继承一个现有的应用程序,不想从现有环境中接触任何东西,而是慢慢迁移。现有的数据库似乎与rails的方式有所不同。我有一个IdCard和IdCardRequest的模型。假设一张IdCard有许多IdCardRequests,但是该IdCard具有上一个IdCardRequest的属性。基本信息(如申请人姓名)似乎是IdCardRequest的属性,而不是IdCard的属性。幸运的是,它们都有一个共同的属性id\u卡号,我可以通过为id\u卡号指定外键和主键来加入它。但是现在我想要一个IdCard模型,其中IdCardRequest的其余字段作为属性Ruby on rails 是否可以使用联接表作为模型的基础?,ruby-on-rails,external-tables,Ruby On Rails,External Tables,在rails中将现有数据库表建模到我的模型时,我有哪些选项?我有一个has_one,属于两个表之间的关系,但我想将它们连接起来,并将其用作模型,只选择相关字段。由于这是一个外部表,我也希望尽量减少查询量 我正在继承一个现有的应用程序,不想从现有环境中接触任何东西,而是慢慢迁移。现有的数据库似乎与rails的方式有所不同。我有一个IdCard和IdCardRequest的模型。假设一张IdCard有许多IdCardRequests,但是该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>