gpt4 book ai didi

ruby-on-rails - 在 Rails 2.2.2 中动态地向 ActiveRecord 模型添加字段?

转载 作者:行者123 更新时间:2023-12-03 15:45:26 24 4
gpt4 key购买 nike

假设我想允许管理用户通过 Rails 应用程序中的界面向 ActiveRecord 模型添加字段。我相信普通的 ActiveRecord::Migration 代码足以修改 AR 模型的表结构(这对许多应用程序来说并不明智 - 我知道)。当然,理论上只能添加某些类型的字段。

显然,向这个新修改的 ActiveRecord 模型添加(或编辑)记录的表单需要在运行时动态构建。常见的 form_for 方法是行不通的。这个讨论表明这只能用 JavaScript 来完成。

http://groups.google.com/group/rubyonrails-talk/browse_thread/thread/fc0b55fd4b2438a5

我过去曾使用 Ruby 来查询对象的可用方法。我似乎记得它非常慢。我对 Ruby 和 Rails 太陌生了,不知道一种优雅的方法来解决这个问题。我希望这里有人可以。我也对解决这个问题的完全不同的方法持开放态度,这些方法不涉及修改数据库。

最佳答案

要访问当前为模型定义的列,请使用 columns方法 - 它将为您提供每一列的名称、类型和其他信息(例如它是否是主键等)

但是,在运行时修改架构是很微妙的。

模式在第一次加载时由每个模型类预加载(并从数据库驱动程序缓存)。在 production模式,Rails 每个模型只在启动时执行一次。

  • 为了强制 Rails 在您修改后刷新其缓存模式,您应该强制 Ruby 重新加载受影响模型的类(几乎是 Rails 在每次请求后自动为您做的,在 development 模式下运行时 - 参见 how to reload a class using remove_const followed by load .)
  • 如果你有一个 Mongrel 集群,你还必须通知集群中的其他进程,它们在自己的独立内存空间中运行,也重新加载它们的模型类(一些集群允许你创建一个“restart.txt”文件,这将导致集群中所有进程的自动软重启,而无需代表您进行额外工作。)

  • 现在,已经说过了,根据您需要解决的实际问题,您可能根本不需要动态更改架构。而不是添加列 col1 , col2col3到某 table entries (型号 Entry),您可以使用名为 dyn_attribs 的表, 其中条目 has_many :dyn_attribs ,以及哪里 dyn_attribs都有 key列(在这种情况下可以具有值 col1col2col3 )和 value列(列出了 col1col2 等的相应值)

    因此,而不是:
    my_entry = Entry.find(123)
    col1 = my_entry.col1
    #do something with col1

    你会使用:
    my_entry = Entry.find(123, :include => :dyn_attribs)
    dyn_attribs = my_entry.dyn_attribs.inject(HashWithIndifferentAccess.new) { |s,a|
    s[a.key] = a.value ; s
    }
    col1 = dyn_attribs[:col1]
    #do something with col1

    以上 inject调用可以被分解到模型中,甚至可以分解到所有模型继承的基类中,这些模型可能需要额外的动态列/属性(请参阅 Polymorphic associations 关于如何让多个模型共享相同的 dyn_attribs 动态属性表.)

    更新

    通过常规 HTML 表单添加或重命名列。

    假设您有一个 DynAttrTable表示具有动态属性的表的模型,以及 DynAttrDef定义给定表的动态属性名称。

    跑:
    script/generate scaffold_resource DynAttrTable name:string
    script/generate scaffold_resource DynAttrDef name:string
    rake db:migrate

    然后编辑生成的模型:
    class DynAttrTable < ActiveRecord::Base
    has_many :dyn_attr_defs
    end

    class DynAttrDef < ActiveRecord::Base
    belongs_to :dyn_attr_table
    end

    您可以继续编辑 Controller 和 View like in this tutorial , 替换 RecipeDynAttrTable , 和 IngredientDynAttrDef .

    或者 , 使用插件之一 reviewed here自动放 dyn_attr_tablesdyn_attr_defs由自动化界面管理的表(包括所有花里胡哨的功能),代表您几乎为零实现工作。

    这应该能让你继续前进。

    关于ruby-on-rails - 在 Rails 2.2.2 中动态地向 ActiveRecord 模型添加字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/574570/

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