`
yangzhihuan
  • 浏览: 168745 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

对于model是全部放在model下面,还是应该分开包来管理的疑问

阅读更多

ruby和rails的文章看了不少.不过都没有看到过讲述如何在rails下面,按模块来分类model的资料(比如像java那样用包来分类java文件,呵呵 ...我是一个java程序员).

我也试了一下把不同功能的model放在model(rails默认的)文件夹下面的子文件夹(模块,也是包),也是可以成功的,不过这样做的话,rails的约定高于配置就用不上了,因为要自己指定各个类的class.比如:

has_one :my_test,:class_name => 'Content::MyTest'

 这样.

我觉得这样比较不爽.

 

另外,

include Human

这样的代码在model和controller里面似乎并不起它就有的作用.比如:我有一Human::User的类,在controll入er里面加

include Human
,再使用
User.new

 这样的代码就会出错,提示也就是说找不到User类云云....

 

最后的感觉就是,rails的约定优于配置思想,确实是还来了好多方便,不过有时候未免不能随心所欲.

呵呵 ...... 也许是我强求了.

 

 

 

分享到:
评论
5 楼 lgn21st 2008-03-02  
能告诉我你为什么不愿意写这样?
@book = Demo1::Book.new
或者实在是对rails的规则不满意,可以操刀改rails的classload的enhance部分吧
4 楼 yangzhihuan 2008-03-01  
多谢 lgn21st  的回复.可能是我没有描述明白我的问题吧.我建立的两个model不是在同一个名称空间下的.引用你的例子吧.假如在app/model下面,有两个文件夹,一个是demo1,一个是demo2,现在有两个model
 class Demo1::Public < ActiveRecord::Base  
  has_many :books  
 end  
 class Demo2::Book < ActiveRecord::Base  
  belongs_to :public  
 end

不知道又当如何呢?

另外如果我要在controller里面引用这两个model,以下的代码:
#test_controller.rb
class  Test < ApplicationController
include Demo1
  def index
        @book = Book.new
  end

end

肯定是错的.但是我又不想把代码写成:
  @book = Demo1::Book.new

我真的没能弄明白rails到底是怎么搞的.
3 楼 lgn21st 2008-03-01  
按模块来分类model其实是有的,只是楼主还没有完全理解rails的autoloading-class机制

比如在"app/model"下,建立一个文件夹"demo",在下面创建两个模型
# model class
class Demo::Public < ActiveRecord::Base
  has_many :books
end
class Demo::Book < ActiveRecord::Base
  belongs_to :public
end

# migration script:
  def self.up
    create_table :publics do |t|
      t.string :name
    end
    create_table :books do |t|
      t.integer :public_id
      t.string :title
    end
  end

  def self.down
    drop_table :publics
    drop_table :books
  end


可以用console测试,两个model工作完全正常,因为两个模型在一个scope内,所以不需要class_name来指定类名,classload会优先在本地scope中查找class:
> public1 = Demo::Public.new(:name => "O'Reilly")
=> #<Demo::Public id: nil, name: "O'Reilly">
> public1.books << Demo::Book.new(:title => "Ruby CookBook")
=> [#<Demo::Book id: nil, public_id: nil, title: "Ruby CookBook">]
> public1.save
  Demo::Public Create (0.000635)   INSERT INTO publics ("name") VALUES('O''Reilly')
  Demo::Book Create (0.000202)   INSERT INTO books ("title", "public_id") VALUES('Ruby CookBook', 1)
=> true


rails对ruby的类加载机制作了增强,引用The rails way上的解释:
引用

• If the class or module is not nested, insert an underscore between the constant’s
  names and require a file of this name. For example:
    • EstimationCalculator becomes require ‘estimation_calculator’
    • KittTurboBoost becomes require ‘kitt_turbo_boost’
• If the class or module is nested, Rails inserts an underscore between each of the
  containing modules and requires a file in the corresponding set of subdirectories.
  For example:
    • MacGyver::SwissArmyKnife becomes require ‘mac_gyver/swiss_army_knife’

• Some::ReallyRatherDeeply::NestedClass becomes require ‘some/
  really_rather_deeply/nested_class’ and if not already loaded, Rails
  would expect to find it in a file called nested_class.rb, in a directory called
  really_rather_deeply, itself in the directory some of which can be found
  somewhere in Ruby’s load path (e.g., one of the app subdirectories, lib, or a plu-
  gin’s lib directory).


其实rails做的比你想像的要多,一旦理解,一切均变得理所当然
2 楼 neodoxy 2008-03-01  
建模要适度,OO别滥用
1 楼 yehs220 2008-03-01  
ruby module又不是java的package,import一下就可以不写package name了
多写个class_name又怎么了?

相关推荐

    JSONModel MVC demo

    JSONModel MVC demo是一个示例项目,它展示了如何在iOS应用中使用JSONModel框架来实现Model-View-Controller(MVC)设计模式。JSONModel是一个强大的库,用于将JSON数据自动映射到Objective-C或Swift的对象中,简化...

    客户管理-model

    客户管理-model

    填坑记录之Vue中v-model与:model区别

    初做vue项目中遇到这个问题,记录一下。 源代码: 打算做的表单验证功能。结果发现在验证的过程中username规则的第一条正确了却一直通过不...正确的做法应该将form标签中v-model改为 :model,这样在子组件中才可以获

    JSP的两种设计模式 Model1和Model2

    JSP的两种设计模式,即Model1和Model2,是Web开发中常见的架构模式,主要用于分离展示层、控制层和业务逻辑层,提高代码的可维护性和可扩展性。 **JSP Model1模式**是最基础的JSP开发模式,主要特点是将业务逻辑、...

    新闻管理系统model1模式

    总结来说,"新闻管理系统model1模式"是一个基于简化MVC架构的项目,它通过集中式处理来实现用户管理、新闻管理和安全控制。虽然在大型项目中可能不太适用,但对于初学者和小型项目,model1模式提供了一个快速开发和...

    model.h5 model.json

    在这个场景中,我们有两个关键文件:"model.h5" 和 "model.json",它们与人脸表情识别任务相关,这是一种利用计算机视觉和机器学习技术来理解人类情绪的先进技术。 `model.h5` 是一个Keras模型的权重和架构存储文件...

    Model View Presenter vs Model View Controller

    在软件开发领域,架构设计是至关重要的,因为它决定了应用程序的可维护性、可扩展...总的来说,理解并选择合适的UI设计模式对于构建高效、可维护的软件至关重要。开发者应根据项目特点和团队能力来决定采用MVP还是MVC。

    韩顺平的model2模式的新闻管理系统

    总结来说,“韩顺平的Model2模式的新闻管理系统”是一个采用经典设计模式构建的Web应用,通过合理的架构设计,实现了业务逻辑与用户界面的有效解耦,提高了系统的可维护性和可扩展性,对于学习和理解Web开发中的MVC...

    Model1和Model开发模式

    总的来说,Model1模式适用于小型、简单的Web应用,而Model2(MVC)模式更适合大型、复杂的项目,因为它提供了更好的可扩展性和可维护性。随着Web开发技术的不断发展,如Spring MVC、Struts等框架的出现,MVC模式得到...

    Modeltest 使用说明

    下面是 Modeltest 的使用说明和相关知识点: 一、Modeltest 概述 * Modeltest 是一个计算机程序,由 David Posada 和 Keith A Crondall 创建 * 主要用于计算 DNA 演化的最佳模型,使用 Maximum Likelihood(ML)...

    QTreeView 使用自定义Model

    本篇文章将深入探讨如何使用QTreeView,并结合自定义Model来实现更灵活的数据展现。 首先,理解QTreeView的工作原理至关重要。QTreeView本身并不存储数据,它只是视图部分,负责呈现数据。数据由Model提供,Model是...

    C#自动生成MODEL

    例如,对于一个数据库表,自动生成的MODEL类会包含该表的所有字段作为类的属性,并且可能还包括一些基本的CRUD(Create, Read, Update, Delete)操作。 在描述中提到的“部分数据存储数据结构”,这可能指的是特定...

    C#自动生成Model工具源码

    对于开发者来说,了解这个工具的工作流程和使用方式是非常重要的。它可以帮助快速构建数据访问层,使得开发者可以更专注于业务逻辑的实现,而不是重复的代码编写。此外,这样的工具通常具有一定的定制性,可以通过...

    用Model-Editor建立Pspice模型

    具体来说,用户需要根据数据手册提供的数据点,在Model Editor中设定参数,Model Editor会帮助用户通过数值分析法计算出符合描点设定的参数值。这些参数值之后会被用于定义元件模型的行为。 此外,Model Editor还...

    tp5快速生成model文件.zip

    下面我们将深入探讨TP5中的Model及其快速生成的方法。 在TP5中,Model类主要负责与数据库的交互,包括数据的增删查改(CRUD)操作。开发者通常会为每个数据库表创建一个对应的Model类,这样可以使代码更加结构化和...

    swift语言model的使用

    Swift语言中的Model是MVC(Model-View-Controller)设计模式的一个重要组成部分,它负责存储和管理应用程序的数据。在iOS开发中,Model层通常包含了业务逻辑、数据处理以及与服务器或本地数据库的交互。本项目以`...

    iOS一键生成model

    在iOS开发中,Model层是应用程序的重要组成部分,它负责存储和管理数据。"iOS一键生成model"的主题意味着我们要探讨一种能够快速、自动化地创建数据模型类的方法,这在处理大量结构化数据时尤为有用。传统的做法是...

    vosk中文model资源,

    总的来说,Vosk中文模型为开发者提供了一个强大且灵活的工具,用于实现高效、可靠的中文语音识别功能,无论是在智能家居、车载导航还是语音助手等场景,都能发挥重要作用。通过持续的更新和优化,我们可以期待Vosk在...

    Qt Model/View 学习笔记

    Qt 4推出了一组新的item view类,它们使用model/view结构来管理数据与表示层的关系。这种结构带来的 功能上的分离给了开发人员更大的弹性来定制数据项的表示,它也提供一个标准的model接口,使得更多的 数据源可以被...

Global site tag (gtag.js) - Google Analytics