【问题标题】:Rails: Creating models from existing tables?Rails:从现有表创建模型?
【发布时间】:2013-08-12 21:22:56
【问题描述】:

我已经从另一个项目创建了表。他们的名字的格式类似于 aaa_bbb_ccc_ddd (所有非复数,有些部分不是约定词)。通过阅读this,我已经成功地从数据库中创建了一个模式。但现在我必须制作实际的模型。我查看了RMRE,但他们在我的表上强制执行 ActiveRecord 约定并更改它们的名称,我不想这样做,因为其他应用程序依赖于这些表。

从现有表自动创建模型和架构的最佳方法是什么?

【问题讨论】:

    标签: ruby-on-rails activerecord ruby-on-rails-4


    【解决方案1】:

    只是一个理论,不确定这在实际应用中如何运作:

    创建models 命名为ActiveRecord 约定要求,例如对于表aaa_bbb_ccc_ddd,您将创建一个模型AaaBbb 并将此模型映射到您的表:

    class AaaBbb < ActiveRecord::Base
        self.table_name = "aaa_bbb_ccc_ddd"
    end
    

    或更人性化的例子:

    class AdminUser < ActiveRecord::Base
        self.table_name = "my_wonderfull_admin_users"
    end
    

    现在您将拥有 AaaBbb 作为路由中的资源,这意味着您将拥有如下网址:

     .../aaa_bbb/...
    

    如果你想在 url 中使用表名,我猜你可以重写路由:

    get 'aaa_bbb_ccc_ddd/:id', "aaa_bbb#show", as: "aaa_bbb"

    再说一遍,这只是一个可能对您有所帮助的理论。我还没有处理过此类案例,但会从这里开始。


    编辑

    自动从数据库创建模型:

    https://github.com/bosko/rmre

    但我认为这将通过 Rails 约定创建具有奇怪名称的模型,您必须将其用作应用程序中的资源。


    我在 SO 上找到的一个很好的模板,以防您想使用与表名不同的模型名称:

    class YourIdealModelName < ActiveRecord::Base
      self.table_name = 'actual_table_name'
      self.primary_key = 'ID'
    
      belongs_to :other_ideal_model, 
        :foreign_key => 'foreign_key_on_other_table'
    
      has_many :some_other_ideal_models, 
        :foreign_key => 'foreign_key_on_this_table', 
        :primary_key => 'primary_key_on_other_table'
    end
    

    【讨论】:

    • 有没有办法从 schema.rb 自动执行此操作?我有 ~20 个表,每个表有 ~10 列。如果可能,不要手动编码名称和属性。
    • 您应该只关心表格并按原样使用它们的列。我不确定您是否可以以某种方式更改列而不影响与此数据库一起使用的其他应用程序。关于自动化我会想一回合..如果我发现有用的东西会更新我的答案。
    • 哦,我没有考虑更改列名。就在现在,我什至没有模型文件,因为我正在倒退。所以我必须输入包括attr_accessible 在内的所有内容,所以我想要一些东西来自动为我生成所有模型代码。
    • 设置表名时是否故意使用反引号(`)?
    • @BruceSun 我很确定应该是逗号。
    猜你喜欢
    • 2015-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-03
    • 2015-08-17
    • 1970-01-01
    相关资源
    最近更新 更多