ruby-on-rails - 如何更改多态模型的外部类型

标签 ruby-on-rails activerecord polymorphism ruby-on-rails-5

我有一个要清理模型的旧数据库。
数据库在应用程序之间共享,因此我无法修改它。

我有一个名为 Catalog 的模型,它依赖于 book_catalogs 表。
我这样做是为了使用好表:self.table_name = 'book_catalogs'
问题是当我想在模型 belongs_to :catalogable, polymorphic: true 中定义 CatalogBook 时,
我找不到将 foreign_type 覆盖为 BookCatalog 的方法。

这是我的模型的一个子集:

class Catalog
  self.table_name = 'book_catalogs'

  has_many :books, through: :catalogs_books
end 

class VirtualCatalog
  has_many :books, through: :catalogs_books
end 

class Book
  has_many :catalogs, through: :catalogs_books
end 

class CatalogsBook
  belongs_to :book
  belongs_to :catalogable, polymorphism: true, foreign_key: :catalog_id
end 

在我的数据库中,我有这个:
catalogs_books
+------------+------------------+---------+
| catalog_id | catalogable_type | book_id |
+------------+------------------+---------+
| 15842      | BookCatalog      | 4567894 |
+------------+------------------+---------+

ActiveRecord 查询示例:
SELECT "books".*
FROM "books"
INNER JOIN "catalogs_books" ON "books"."id" = "catalogs_books"."book_id"
WHERE "catalogs_books"."catalog_id" = $1
AND "catalogs_books"."catalogable_type" = $2
[["catalog_id", 1], ["catalogable_type", "Catalog"]]`

如何用 catalogable_type 替换 Catalog BookCatalog

最佳答案

您使用 foreign_type选项:

class CatalogsBook
  belongs_to :book
  belongs_to :catalogable, polymorphism: true, foreign_type: :book_catalog, foreign_key: :catalog_id
end

关于ruby-on-rails - 如何更改多态模型的外部类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50817470/

相关文章:

mysql - 将以下 MySQL 查询转换为 Codeigniter Active Records

php - Yii-Active Record 以字符串形式返回特定列的平均结果

rust - Rust 中的 "Subclassing"特征

clojure - 为 Clojure 的序列添加自定义行为

ruby-on-rails - 在 ruby​​ on rails 中使用 slim 而不是 erb 动态传递 id

ruby-on-rails - update_attributes 始终返回 true,即使 nested_attributes 无效

c# - CaSTLe ActiveRecord - 总是更新 child ,为什么?

ruby-on-rails - Heroku - 不起作用 "rake"命令:PG::错误:错误:关系 "roles"不存在

javascript - 基于所选链接的模态弹出窗口的动态内容

c# - 为什么我不能紧凑地使用我想要的 C# 多态性?