将Rails Application连接到现有的MySql数据库



我是Rails的新手,真的很喜欢它。 我正在将我的 php 应用程序转换为 ROR 应用程序。该应用程序使用的是 MySql DB,因此我想将 ROR 应用程序与已创建的数据库连接,并希望保留数据。PHP 有 mysqli 函数,ROR 有类似的东西吗?

我想你需要的不仅仅是达里尔桑托斯的答案。他的回答将指导您建立与数据库的连接,但将表映射到模型需要更多的许可。

作为您mysqli替代请求的答案,是的,Ruby 也有一个 mysql 连接器。但你不需要它。

标准 ROR 捆绑包带有一个内置的 orm 模块,称为 ActiveRecord。

除非另有说明,否则AR采用模型名称,将其复数化,并映射到连接数据库中具有该名称的表。还有其他约定,例如主键、外键命名等。您可以在AR文档中搜索这些内容。

但是您可以覆盖这些行为,例如

class Book
self.table_name = 'something_other_than_books'
end

因此,AR 将查找something_other_than_books表,并自动将其列作为此类的属性进行孪生。由于 AR 期望id字段作为该表的主键,如果您有其他字段,您还必须显式声明它。

class Book
self.table_name = 'something_other_than_books'
self.primary_key = 'book_id'
end

以下是 AR 查询指南。顺便说一句,它与PHP中的Eloquent有很多相似之处。如果您熟悉它,您将轻松选择它。

至少,让我们展示一些示例及其 SQL 等效项。

Book.find(2) # based on below model 
#=> SELECT * FROM something_other_than_books WHERE book_id = 2
Book.where(author: "Jack London")
#=> SELECT * FROM something_other_than_books WHERE author = 'Jack London'
Book.pluck(:book_id, :author)
#=> SELECT book_id, author FROM something_other_than_books
Book.order(book_id: :asc).pluck(:author)
#=> SELECT author FROM something_other_than_books ORDER BY book_id DESC

更新

与原始PHP不同,Rails是基于MVC的全栈Web应用程序。PHP生态系统中的Rails有Symfony,Laravel,Cake,Yii2,FuelPHP等。MVC 框架的主要优点之一是,您无需在视图中执行 sql 查询。这意味着,您不会请求文件并等待它执行用 html 代码包装的 sql 查询。相反,您收到一个请求,您的路由器将其映射到控制器,它将数据传递到域(模型),接收结果,然后在视图文件中呈现这些数据。

想想下面的php文件(比如说书.php)。

<?php
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "my_db";
$conn = new mysqli($servername, $username, $password, $dbname);
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
$sql = "SELECT book_id, author FROM something_other_than_books";
$result = $conn->query($sql);
if ($result->num_rows > 0) {
while($row = $result->fetch_assoc()) {
echo "Book ID: " . $row["book_id"] . " - Author: " . $row["author"] . "<br>";
}
} else {
echo "0 results found";
}
$conn->close();
?> 

因此,当您向 http://yourdoma.in/books.php 发送获取请求时,您将获得图书列表。

在 Rails 中,你的代码结构更好——这首先可能看起来有点困难,但当你的应用程序增长时,你会发现,处理重复性任务非常容易。

模仿上述 php 脚本的步骤及其在 Rails 中的结果。

1.在路由文件中定义路由

#config/routes.rb
get '/books' => 'books#index'
#or, resources :books, only: [:index]

2.创建控制器操作

#app/controllers/books_controller.rb
class BooksController < ApplicationController
def index
@books = Book.pluck(:book_id, :author)
end
end

3.书籍模型

#app/models/book.rb 
class Book < ActiveRecord::Base
self.table_name = 'something_other_than_books'
self.primary_key = 'book_id'
end

4.最后查看文件。(如果未明确声明,books_controller.rb 中的索引操作将尝试使用@books实例变量呈现 app/views/index.html.erb)

#app/views/index.html.erb
<% @books.each do |book|  %>
Book ID: <%= book.book_id %> - Author: <%= book.author %>
<% end %>

如果使用 rails 生成器,则无需手动逐个创建这些文件。如果我可以为您提供更多帮助,请告诉我。

是的,请查看config/database.yml,这通常是存储数据库配置设置的位置。这是这方面的指南。你必须安装 mysql(或者我相信 mysql2)gem。

从我的一个旧项目中,这是我config/database.yml的样子:

development:
adapter: mysql2
username: root
database: APP_NAME_development
host: localhost
test:
adapter: mysql2
username: root
database: APP_NAME_test
host: localhost

最新更新