gpt4 book ai didi

ruby-on-rails - 创建或覆盖 Rails Active Record 宏

转载 作者:行者123 更新时间:2023-12-04 07:29:34 25 4
gpt4 key购买 nike

在 Rails 应用程序中,Active Record 通过宏创建了 created_atupdated_at 列(它似乎也被称为“魔法列”)。

参见 Active Record Migrations

我对该机制有一些疑问:

  • 是否可以覆盖它以获得第三列(例如 deleted_at)?
  • 是否可以创建一个新的宏 t.publishing,例如创建 publish_uppublish_down 列?
  • 在哪里编码?

显然,我知道我可以手动添加这些列,但我想知道如何使用宏来实现它。

在 Rails 4 上工作。

最佳答案

ActiveRecord::ConnectionsAdapters::TableDefinition::Table 类负责所有高级迁移,如 columnindexindex_exists? 等等。它有 timestamps 方法,可以为您添加 created_atupdated_at 列:

  # Adds timestamps (+created_at+ and +updated_at+) columns to the table. 
# See SchemaStatements#add_timestamps
# t.timestamps
def timestamps
@base.add_timestamps(@table_name)
end

基本上,您可以通过这种方式(在您的初始值设定项中的某处)对其进行 monkeypatch:

class ActiveRecord::ConnectionsAdapters::TableDefinition::Table
def timestamps
@base.add_timestamps(@table_name)
@base.add_column(@table_name, :deleted_at, :datetime)
end
end

这同样适用于创建一个新的宏:

class ActiveRecord::ConnectionsAdapters::TableDefinition::Table
def publishing
@base.add_column(@table_name, :publish_up, :datetime)
@base.add_column(@table_name, :publish_down, :datetime)
end
end

在那之后,你应该能够做这些事情:

class CreateUsers < ActiveRecord::Migration
def self.up
create_table :users do |t|
t.string :first_name
t.string :last_name
t.timestamps
t.publishing
end
end

def self.down
drop_table :users
end
end

查看类(class) source code在 github 上获取更多见解。

关于ruby-on-rails - 创建或覆盖 Rails Active Record 宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24201039/

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