从 Rails 数据库中检索数据?

Ros*_*osh 3 ruby search ruby-on-rails

我的项目中有两个表,分别称为 events 和 trainers。events 表包含 trainer 的 id。我有下拉菜单,其中包含培训师的姓名,如下所示。

<% form_tag "/events/find_trainer" do %>
<%= collection_select("event", "trainer", @trainers , :id, :name, {:prompt => true}) %>
<%= submit_tag "search" %>
<%end%>
Run Code Online (Sandbox Code Playgroud)

然后我在控制器中创建了 find_trainer 方法来检索事件表的数据。

def find_trainer
@events=Event.find(:all, :conditions=> { :trainer=>params[:id]})
  end
Run Code Online (Sandbox Code Playgroud)

这不会从数据库中检索任何内容。我正在使用 postgresql 和 ruby​​ 1.8.7 以及 Rails 2.3.8 版本。我无法理解我的错..有人可以帮助我吗?

tho*_*ler 5

如果您使用 has_many 定义了关联,则不需要使用这种方式查找

你只需找到教练:

@trainer = Trainer.find_by_id(params[id])
Run Code Online (Sandbox Code Playgroud)

然后可以访问它的所有事件

@trainer.events
Run Code Online (Sandbox Code Playgroud)

为此,您需要在训练器模型中:

has_many :events
Run Code Online (Sandbox Code Playgroud)

在您的事件模型中:

belongs_to :trainer
Run Code Online (Sandbox Code Playgroud)

以及 events 表中的 trainer_id 列

编辑

将foreign_key 列命名为“trainer”是一个坏主意,它违反了Rails 约定并使您的生活变得更加困难。你可以告诉 Rails 使用哪个列名,如下所示:

has_many :events, :foreign_key => :trainer
Run Code Online (Sandbox Code Playgroud)

belongs_to :trainer, :foreign_key => :trainer
Run Code Online (Sandbox Code Playgroud)

但如果可能的话,您应该避免这种情况,并更改迁移并重建数据库。此功能主要被认为允许使用旧项目中的数据库,而不是用 Rails 编写的。

此外,其他错误告诉您 params[:id] 中没有值。数据库中有夹具数据吗?

为了看看它是否有效,你可以从

@trainer = Trainer.first
Run Code Online (Sandbox Code Playgroud)

这需要第一位训练员,然后

@trainer.events
Run Code Online (Sandbox Code Playgroud)

如果该培训师存在任何事件,则应该有效。然后你可以找出 params[:id] 出了什么问题,很可能是某些链接无法正常工作,也许你的表单错误或者到控制器的路由有错误。

你同时尝试了太多的事情,却没有确定基础知识是否有效。这就是我们通常在 Ruby on Rails 中进行测试驱动开发的原因。

首先建立Trainer模型。然后测试它,通过编写和加载固定装置来确保有训练器,并且 Rails 可以找到它们。

之后添加事件模型(以及一些夹具数据)。如果你没有明确地编写测试,那么至少使用Rails控制台(我认为它是Rails 2.x中的命令脚本/控制台)来测试。仅当您 100% 确定它在模型级别上有效时,才开始编写控制器。这样,您在任何给定时刻只需处理一个错误。