论坛首页 编程语言技术论坛

Rails是否可以这样解决这个辣手的问题?

浏览 4885 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2006-10-25  
目前开发的产品中有这样的一个需求,产品可以建立任意多的项目,每建立一个项目就要根据项目名称建立三个数据库表来保存该项目的人员,项目详细记录,还有项目中的分类。那么如果按照ROR的约定我就要创建很多很多的model与数据库相应的表建立关系,我的控制器还要识别出来关联的是那个model.
我在想是否可以动态创建model 动态让controoler识别用户要访问哪个项目 根据项目来指定相关的表的关联呢?

可能说的不够清楚 我来举一下实例
数据库表设计
项目表[Items]:
      id   name
记录   2   Ruby文档管理系统

程序需要根据 建立的项目记录自动生成三个表

------------------------------------------------

项目用户表[2_users]
     id     name 
记录  1      emir

------------------------------------------------

项目分类表[2_classes]
      id   name
记录   1   RubyIO处理
        2   Ruby语法

-------------------------------------------------
项目详细记录表[2_records]
      id    title    dep     2_class_id  2_users_id
      1     题目1   题目1描述       1           1
      2     题目2   题目2描述       2           1
-------------------------------------------------

用户在登录时就要选择进入哪个项目,选择后将可以查看该项目下的所有的记录 并可以进行增删改

以我的理解 按照ror的约定  每建立一个项目我就要根据该项目id生成数据库表  动态生成model\controoler ,项目越多生成的物理文件越多

我目前所做的是 每建立一个项目 生成三个表  然后再动态生成三个model文件,在controller内根据用户选择的访问的项目id来决定指定关联哪个项目的model,思路是这样  但还没有完全实现  因为我刚刚接触ROR不久。

我想问大家是否有更好的办法来解决这个需求,不然以我这样的方式会变得很麻烦 还不如使用java or asp.net来的方便。

请大家指教一二
   发表时间:2006-10-25  
为啥每建立一个项目就要生产三个新的表? 这些表上加一个collumn区分不同的项目不行吗?
0 请登录后投票
   发表时间:2006-10-25  
语言所描述的内容是一样的,只是形式不同。
0 请登录后投票
   发表时间:2006-10-25  
不需要你这样搞。

数据库的设计

产品表
=====
产品ID,产品名称,

项目表
=====
项目ID,项目名称,产品ID

项目详细信息
项目ID,项目信息1,项目信息2,.....

人员表
=====
人员ID,人员名称

项目--人员表
项目ID,人员ID



产品:has_many 项目

项目:has_and_belongs_to 人员
项目:belongs_to 产品

人员:has_and_belongs_to 项目


让大家见笑了。初步想到的就这些。这是数据库设计的问题,与Java/asp.net无关。
0 请登录后投票
   发表时间:2006-10-25  
开个玩笑: 这个问题真的好 '辣' 手. 应该是棘手吧, 呵呵
0 请登录后投票
   发表时间:2006-10-25  
这不是关系数据库的设计风格,而是Excel的风格。。。
0 请登录后投票
   发表时间:2006-10-26  
cookoo 写道
这不是关系数据库的设计风格,而是Excel的风格。。。
每一个公司有每一个公司的考虑
就有一些情况制约你不能使用使用外键来联系多个表之间的关系。


而我所要问的即是如果动态创建ActiveRecord ,或者Controller。
在这里要感谢一位gtalk上认识的朋友,他曾经遇到相同的问题。
这里给出如何创建ActiveRecord
module Dynamic
   class << self
     def klass(table_name)
       tname = class_name_from_table(table_name)
       #see if it has already been defined
       const_missing(tname)
     rescue NameError
       define_klass(table_name)
     end
     def objeck(table_name)
       klass(table_name).new
     end
     private
       def class_name_from_table(table_name)
         Inflector.camelize(table_name)
       end
       def define_klass(table_name)
         tname = class_name_from_table(table_name)
         class_def = <<-end_eval
           class #{tname} < ActiveRecord::Base
             set_table_name('#{table_name}')
           end
         end_eval
         eval(class_def, TOPLEVEL_BINDING)
         const_get(tname)
       end
   end
end

使用样例: class ProjectController < ApplicationController include Dynamic

def index
   @projects = Dynamic.klass("projects1").find :all
   #Project.set_table("projects1")
   #@projects = Project.find :all
end


0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics