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 版本。我无法理解我的错..有人可以帮助我吗?
如果您使用 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% 确定它在模型级别上有效时,才开始编写控制器。这样,您在任何给定时刻只需处理一个错误。