OOP 如何转化为 Rails?
Posted
技术标签:
【中文标题】OOP 如何转化为 Rails?【英文标题】:How does OOP translate to Rails? 【发布时间】:2021-11-02 15:59:51 【问题描述】:我很难理解 Rails 的 MVC 系统及其与 Ruby 类的关系。在 Rails 中,感觉就像对象走出窗外,被数据库取代。
我现在正在处理一个面试问题,它要求我创建一个接受 HTTP 请求并返回响应的网站。我对 JS 不是很熟悉,而且我很喜欢 Ruby,所以我一直在使用 Rails。但是我觉得受到数据库的限制......感觉就像我在 Ruby 中可以轻松完成的事情(例如,查看对象的哈希并通过多个约束过滤直到我得到我想要的)要困难得多一个数据库。
面试问题说我不需要使用持久数据存储,但这在 Rails 中似乎是一个很大的禁忌。有没有人有关于如何改变我的心态的建议? (或者,在短期内,推荐其他易于使用的工具?)
顺便说一句 - 我知道这可能会引出一个问题,“如果你不知道这些东西,你为什么要面试?”这是一次实习,我只是想尽可能多地开始面试,以便习惯这个过程。
【问题讨论】:
我认为这是 Rails 中一个很常见的误解,即您必须将所有内容都放入 M、V 或 C 中,这是不正确的。尽管 Rails 并没有真正的 PORO(普通的旧 Ruby 对象)的内置或标准位置,但您确实可以将它们放在您想要的任何位置。基本上,数据库不会替换对象,即使尝试让它们这样做是一个常见的错误。 在 Rails 和大多数Object Relational Mappers 中,每个表都是一个类,每一行都是一个对象。现实情况是最终您将拥有太多数据而无法将所有内容保存在内存中,或者对于一个简单的文件来说太复杂了;你需要一个数据库。与手动编码相比,数据库可以做更强大、更复杂的事情。我建议从Rails Guides 和W3Schools SQL Tutorial 开始。 我很难理解“对象走出窗外,被数据库取代”。物体不能出窗外;是红宝石。数据需要存储在某个地方,而数据库擅长存储数据。 Rails 和数据之间的交集是 ActiveRecord/ActiveModel,这在 Rails 文档和任何 Rails 教程中都有讨论——我会退后一步,深入了解一些基本的 Rails 内容。 @DaveNewton 很公平,我不认为我以最好的方式表达了我的问题——在过去几个月学习 Ruby 并知道一切都是对象之后,我在使用 Rails 时遇到了问题' 专注于 ActiveRecord。感觉(作为一个新手)我在如何与我创建的模型进行交互方面受到了更多限制,而不是如何与我在命令行 Ruby 程序中创建的类进行交互。 它只是一个可以像任何其他对象一样扩展的对象(我的意思是,这就是您构建 Rails 应用程序的方式)。他们是通过各种查询方法进入数据库的 Ann OO 视图。我不清楚你认为缺少什么——你提到了 AR 允许你做的“循环哈希并通过多个约束过滤”,但效率更高,因为这是 DB 的优化目标。 【参考方案1】:我同意这可能是 Rails 新手面临的最困难的事情之一。在 Rails 指南中,模型几乎总是 Active Record 模型(也就是映射到数据库表)。但是,并非所有模型都是 Active Record 模型和/或需要持久化是完全正常的。我认为您缺少的术语是普通旧 Ruby 对象 (PORO) 和活动模型。
PORO 可以是任何东西,从超级简单的东西到 API 的映射或将几个其他 (ActiveRecords) 模型组合在一起。
例如,您可以有一个版本控制器来显示您的网络应用程序的最新版本。版本将通过从 git 存储库、文件或环境变量中读取 SHA 来确定。所以它永远不会被持久化在数据库中。
class Version
def self.from_git
new(`git rev-parse HEAD`)
end
def initialize(name)
@name = name
end
def to_s
@name
end
end
class VersionsController
def show
@version = Version.from_git
end
end
这里有一些你可能会觉得有用的链接
https://www.codewithjason.com/code-without-service-objects/ https://www.oreilly.com/library/view/build-chatbot-interactions/9781680507089/f_0047.xhtml https://thecodest.co/blog/hi-im-poro-2/ https://www.toptal.com/ruby-on-rails/decoupling-rails-components https://guides.rubyonrails.org/active_model_basics.html https://www.codewithjason.com/extracting-tidy-poro-messy-active-record-model/【讨论】:
我没有意识到你可以在 Rails 中使用(或“应该”使用)PORO。谢谢!【参考方案2】:但是我觉得被数据库限制了...感觉就像我可以在 Ruby 中轻松完成的事情(例如,查看对象的散列并通过多个约束过滤直到我得到我想要的)太多了使用数据库更难。
使用数据库具有挑战性,因为 SQL 是一个完全不同的范例。 SQL 不是面向对象,而是基于表和关系代数。
作为初学者,每个人都发现破解循环和创建if/else
构造来处理数据更容易。但它并不是一个真正可行的大规模解决方案。您花在学习 SQL 上的任何时间都将在未来获得巨大的回报。
我很难理解 Rails 的 MVC 系统及其与 Ruby 类的关系。在 Rails 中,感觉就像对象走出窗外,被数据库取代。
这与 Rails 或 MVC 没有太大关系。它相当 ActiveRecord,它是 Rails 默认内置的对象关系映射器 (ORM)。
相比其他ORM的ActiveRecord有很多神奇之处。它从数据库中读取您的表定义并自动设置属性——在其他 ORM 中,您可以在模型类、存储库类、XML 文件或注释中显式执行此操作。这种魔法非常适合提高生产力,但作为初学者可能很难理解。
ActiveRecord 在很大程度上仍然是一种面向对象的设计——只是有更多的元编程,你可能已经习惯了。
面试问题说我不需要使用持久数据存储, 但这在 Rails 中似乎是一个很大的禁忌。
这是一种误解。 Rails 是一个非常模块化的框架,可以在没有 ActiveRecord 的情况下使用,也可以与其他对象关系映射器(或对象-文档映射器)一起使用,甚至根本不需要任何存储。
模型也根本不需要持久化。它们只是包含应用程序业务逻辑的对象。
大多数初学者指南都是从 ActiveRecord 开始的,因为绝大多数 Web 应用程序都使用 SQL 数据库*。
【讨论】:
* 基于我高度主观的经验。 谢谢,这非常有帮助!我没有意识到你可以在没有 ActiveRecord 的情况下使用 Rails(或者“应该”)。有人建议我使用像 Sinatra 这样的轻量级框架来应对这个特殊的挑战(尤其是因为我不需要持久的数据存储),它肯定有助于我更好地理解 MVC。我想我只是需要一个从纯 Ruby 到 Rails 的渐进式过渡。以上是关于OOP 如何转化为 Rails?的主要内容,如果未能解决你的问题,请参考以下文章