ruby-on-rails - 是否可以使用连接表作为模型的基础?
问题描述
在 Rails 中将现有数据库表建模到我的模型有哪些选择?我在两个表之间有一个 has_one 和 belongs_to 关系,但我想加入它们并将其用作模型(并且只选择相关的字段)。由于这是一个外部表,我还想尽量减少查询量。
我正在继承现有的应用程序,并且不想触及现有环境中的任何内容并慢慢迁移。现有的数据库似乎与 rails 方式不同。我有 IdCard 和 IdCardRequest 的模型。可以假设一个 IdCard 有许多 IdCardRequest,但是 IdCard 具有最后一个 IdCardRequest 的属性。似乎申请人名称等基本信息是 IdCardRequest 而不是 IdCard 的属性。幸运的是,它们都有一个共同的属性 id_card_number,我可以通过将 foreign_key 和 primary_key 指定为 id_card_number 来加入它。但是,现在我想要一个模型 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 约定的数据库视图?
例如
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>
然后,您可以制作一个可以IdCardRequests
正常工作的导轨模型。您可以使其中一列成为视图中的主键,或者告诉模型使用其中一列self.primary_key = :my_key_column
推荐阅读
- java - 如何将多个 Map/List/Array 从 API url 传递到 Java 中的 RestController?
- asp.net - 通过 ftp 上传到 hostgator 的 ASP.net Web 应用程序不允许查看它们。它抛出403错误
- sql-server - 锁挂起(死锁?)有两个事务
- reactjs - 如何使用 Material UI 在某些断点处隐藏/显示元素?
- ios - 当 git 提交时 Xcode 项目应该跟踪哪些文件
- php - 在 Debian 10 中安装 php7.4-cgi
- python - 如何处理在窗口生成的csv末尾附加的空行?
- amazon-web-services - 使用 AWS 控制台自动激活接收账单警报选项
- docker - docker pull 失败,出现 503
- networking - OSPF 区域拓扑