【问题标题】:Is there a framework that allows me to define a model only once?是否有一个框架允许我只定义一次模型?
【发布时间】:2012-04-19 21:24:58
【问题描述】:

我刚刚完成了几个模型的创建,并且必须将它们的所有属性分别写入 1)Rails ActiveRecord 2)Rails 数据库迁移和 3)Backbone.js 模型。我感觉不是很干燥。我假设解决这个问题的第一步是切换到 node.js,我可以在后端和前端使用 CoffeeScript(理想情况下重用相同的 Backbone.js 模型),但是数据库模式呢?我意识到我可以创建一个从模型属性生成 SQL 的框架,但在开始这项工作之前,我想知道这样的东西是否已经存在或正在开发中。

如果这个框架可以统一视图和控制器,这样我就没有 app/views、app/controllers、app/assets/javascripts/views、app/assets/javascripts/routers 等,那也很棒都在不同的地方定义了类似的东西。

【问题讨论】:

    标签: ruby-on-rails model-view-controller node.js backbone.js dry


    【解决方案1】:

    这是Wakanda系统的目标之一。

    【讨论】:

    • 我从未尝试过,因为我不相信这项技术。我只知道他的社区经理尝试我测试它:)
    【解决方案2】:

    查看Derbyactive development 下的 node.js 框架,它试图统一视图和控制器(以及更多):

    [Derby] 在服务器和浏览器中运行相同的代码,并同步数据 自动地。 Derby 负责模板渲染、打包和 开箱即用的模型视图绑定。由于所有功能都旨在 协同工作,无需重复代码和粘合代码。

    我正在使用 Derby 构建一个小型的爱好应用程序,到目前为止,它既有趣又具有挑战性。一个统一的新世界有它自己的物理学。

    需要注意的一点是,Derby 建立在 Racer 之上,这是一个“实时模型同步引擎”;如果您期望将 Backbone.js、express 和一些数据库层拼接在一起的轻量级胶水代码之类的东西,您可能会发现它“很重”。


    编辑:我还没有仔细研究过的其他框架:

    【讨论】:

      【解决方案3】:

      对于模型,您可以简单地创建一个基类并从中继承。您只需要在派生类中调用set_table_name。我已经摆脱了这个。它的优点是您可以调整派生类中的功能。示例:

      app/models/widget.rb:

      class Widget < ActiveRecord::Base
         def some_common_method
            # ...
         end
      end
      

      app/models/blue_widget.rb:

      class BlueWidget < Widget
         set_table_name "blue_widgets"
         # special methods, if any
      end
      

      等等

      对于迁移,只需为公共表列定义一个函数。例如:

      def common_table_columns(t)
         t.integer :id
         t.stirng :some_string
         # etc
      end
      
      create_table(:table1) { |t| common_table_columns(t) }
      
      [:table2,:table3,:table4].each do |name|
         create_table(name) { |t| common_table_columns(t) }
      end
      
      create_table :table5 do |t|
          common_table_columns(t)
          t.string :extra
      end
      

      不能代表 Backbone.js(刚刚),但我 100% 确信您可以实现相同类型的重复代码消除。 Javascript 与 ruby​​ 一样具有动态性。

      说了这么多,为什么你有几个相同的表?您是否针对正确的问题使用了正确的解决方案?

      【讨论】:

      • 我一定是不清楚。我没有创建类似的模型,我只是想强调我必须在每个模型的 3 个位置或多或少地声明相同的模型,并且正在寻找一种方法将其减少到一个位置。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-26
      • 2014-09-05
      • 1970-01-01
      • 1970-01-01
      • 2014-02-20
      相关资源
      最近更新 更多