在Rails中为一个控制器提供多个数据库表

时间:2015-04-03 01:54:44

标签: ruby-on-rails ruby

我有一个使用Rails的项目,我希望有多个SQLite表与一个控制器相关联。我环顾四周,对此没有任何看法。这可能吗?我现在有多个控制器,但我想尝试合并它们。

1 个答案:

答案 0 :(得分:3)

Ruby on Rails使用MVC范例。这意味着,非常简单的解释,模型(M)负责数据存储和检索,视图(V)用于显示,控制器(C)负责发送和发送请求。

一个简单的例子:用户发送显示页面的请求。控制器接受此请求。如果需要在页面上显示数据库中的数据,则控制器会询问相关模型。该模型从数据库中获取此数据,将其发送到控制器,然后控制器将其发送到视图。

如果在您的示例中,数据存储在不同的数据库表中,则控制器负责询问其相关模型。

例如,您有一个名为projects的数据库表和另一个名为tasks的数据库,第三个名为users,而您必须拥有三个模型:项目模型,任务模型和用户模型。每个模型都负责其数据库表。

也许您有一个视图(它将生成一个html页面),您希望在其中显示来自所有三个表的数据。我们称之为show.html。

遵循Rails惯例,您的控制器中会有相应的操作“show”。您必须告诉此操作,视图需要哪种数据。

class YourAwesomeController < ApplicationController

  def show
    @project = Project.find(1)
    @task    = Task.find(21)
    @user    = User.find(42)
  end
  ... # some other actions

end

这意味着,您的控件'YourAwesomeController'中的操作'show'要求模型Project从'projects'表中获取id = 1的行,然后是Taks模型从'tasks中获取行'id = 21的表,最后它希望User模型从表'users'中获取id = 42的行。

注意:控制器不知道所需数据的存储位置。他只知道(通过你的代码)模型(可以想象用户的数据存储在外部网络服务中。如果是这样,模型知道这一点,控制器不介意,因为他只是要求模型发送给他他需要的数据)

在'show.html.erb'中,您现在可以使用实例变量@ project,@ task和@user来显示数据。

如果遵循惯例,Ruby on Rails会显示其全部功能和魔力。但是,即使您不使用Rails,也始终建议遵循MVC范例。