gpt4 book ai didi

ruby-on-rails - 实现抽象基模型类,Rails Way™

转载 作者:行者123 更新时间:2023-12-03 22:20:53 24 4
gpt4 key购买 nike

我有一个 预订 下载 共享许多属性的模型,所以我的目标是从 继承公共(public)属性可下载资源 模型。
看过STI ,但我去了abstract base model class取而代之的是:

  • 楷模:
    class DownloadableResource < ActiveRecord::Base
    self.abstract_class = true

    attr_accessible :title, :url, :description, :active, :position
    validates :title, :url, :description, presence: true
    scope :active, where(active: true).order(:position)
    end

    class Book < DownloadableResource
    attr_accessible :cover_url, :authors
    validates :cover_url, :authors, presence: true
    end

    class Download < DownloadableResource
    attr_accessible :icon_url
    validates :icon_url, presence: true
    end
  • 迁移:
    class CreateDownloadableResources < ActiveRecord::Migration
    def change
    create_table :downloadable_resources do |t|
    t.string :title
    t.string :url
    t.text :description
    t.boolean :active, default: false
    t.integer :position
    t.timestamps
    end
    end
    end

    class CreateBooks < ActiveRecord::Migration
    def change
    create_table :books do |t|
    t.string :cover_url
    t.string :authors
    t.timestamps
    end
    end
    end

    class CreateDownloads < ActiveRecord::Migration
    def change
    create_table :downloads do |t|
    t.string :icon_url
    t.timestamps
    end
    end
    end

  • 迁移后,当我创建新书时,结果远非预期:
    > Book.new
    => #<Book id: nil, cover_url: nil, authors: nil, created_at: nil, updated_at: nil>

    有人可以说明如何实现抽象基模型类技术,以便 ActiveRecord 模型可以通过 inheritance 共享公共(public)代码却被持久化到不同的数据库表?

    最佳答案

    通过将模型声明为抽象,您实际上是在说没有基础表并且您希望允许子类化。这意味着:

  • 您不需要 downloadable_resources
  • Book.table_name 打印 books而不是 downloadable_resources

  • 正如@Finbarr 已经提到的,这也意味着 BookDownload模型需要在其表中具有所有属性。

    那么这实际上有什么用呢?在我看来不是很多。您可以共享验证、范围等,但您可以通过包含自定义模块更轻松地实现所有这些。

    为了解决您的问题,我可能会采用不同的方法。我将创建另一个名为 DownloadableContent 的模型那将是自给自足的。它将包括验证,并且该表将具有所有属性。最后是模型 BookDownload会有一个多态的 has_oneDownloadableContent 的关系模型。

    您可以使用 STI 方法,但我通常不喜欢将所有自定义属性混合在一起。

    关于ruby-on-rails - 实现抽象基模型类,Rails Way™,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14088768/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com