从rails中的数据库中检索数据?

时间:2011-08-24 04:43:32

标签: ruby-on-rails ruby search

我的project.events表中包含两个名为events和trainers的表,其中包含training的id。我有下拉菜单,其中包含教练姓名,如下所示。

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

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

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

这将不会从database.i使用postgresql和ruby 1.8.7和rails 2.3.8版本检索任何内容。我无法理解我的错......有人能帮帮我吗?

3 个答案:

答案 0 :(得分:4)

如果您使用has_many定义了关联,则无需使用find

你找到了培训师:

@trainer = Trainer.find_by_id(params[id])

然后可以使用

访问所有事件
@trainer.events

为此,您需要在训练师模型中使用:

has_many :events

在您的活动模型中:

belongs_to :trainer

和事件表中的trainer_id列

修改

将foreign_key列命名为“培训师”是一个坏主意,它打破了Rails惯例并使您的生活变得更加困难。你可以告诉Rails使用哪个列名:

has_many :events, :foreign_key => :trainer

belongs_to :trainer, :foreign_key => :trainer

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

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

要看,如果它完全有效,你可以从

开始
@trainer = Trainer.first

这将需要第一个培训师,然后

@trainer.events
如果存在此培训师的任何事件,

应该有效。然后你可以找出params [:id]有什么问题,很可能是某些链接无法正常工作,可能是你的表单错误或者你的控制器路由错误。

你正在尝试太多的东西,而没有确定,基础工作。这就是我们通常在Ruby on Rails中进行测试驱动开发的原因。

首先设置Trainer模型。然后测试它,通过编写和加载灯具确保有训练器,并且Rails可以找到它们。

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

答案 1 :(得分:0)

外键通常以它们指向的表命名。

试试这个?

@events = Event.find(:all, :conditions => {:trainer_id => params[:id]})

答案 2 :(得分:0)

这个post方法的参数将是params [:event] [:trainer]这将带有id的值。

并且还必须检查foreign_key的列值。