我的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版本检索任何内容。我无法理解我的错......有人能帮帮我吗?
答案 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的列值。