【问题标题】:retrieve data from database in rails?从 Rails 的数据库中检索数据?
【发布时间】:2011-11-02 11:41:56
【问题描述】:

我的 project.events 表中有两个名为 events 和 trainers 的表,其中包含 trainer 的 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

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

【问题讨论】:

标签: ruby-on-rails ruby search


【解决方案1】:

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

还有foreign_key的列值必须检查。

【讨论】:

    【解决方案2】:

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

    你只要找到教练:

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

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

    @trainer.events
    

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

    has_many :events
    

    在您的事件模型中:

    belongs_to :trainer
    

    以及事件表中的 trainer_id 列

    编辑

    将 foreign_key 列命名为 'trainer' 是个坏主意,它违反了 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% 确定它在模型级别上工作时,才开始编写控制器。这样,您在任何特定时刻都只需要处理一个错误。

    【讨论】:

    • 我遇到了一个异常.. nil:NilClass 的未定义方法“事件”我该怎么办?我已经定义了我与 has_many 的关联...
    • @Rosh:什么例外,在哪里?这完全是原始的 Rails 代码,它必须工作。您是否有 trainer_id 列或者它被命名为 trainer?
    • @Rosh:nil 的未定义方法“事件”:NilClass 说它没有找到培训师。那么@trainer 是 nil 并且 nil 没有“事件”
    • 我对轨道很陌生,实际上我不知道很多事情。这就是我问愚蠢问题的原因。在我的项目中,我使用了事件日历插件,如果我在我的事件模型中使用了 has_many :events, :foreign_key => :trainer,它会给出一个没有 id 的称为 trainer 的异常。我该怎么办?
    • 我应该将我的表格列更改为 trainer_id 吗?
    【解决方案3】:

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

    试试这个?

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

    【讨论】:

    • PGError: 错误: 列 events.trainer_id 不存在 LINE 1: SELECT * FROM "events" WHERE ("events"."trainer_id" IS NULL)... ^ : SELECT * FROM "events " WHERE ("events"."trainer_id" IS NULL) 我得到了这个异常 ....
    • @Rosh:这看起来好像您将事件表中的外键列命名为“trainer”而不是“trainer_id”。这将是一个坏主意,因为它违反了 Rails 约定。如果可能的话,你应该改变它。这也会给我的答案带来问题,因为 has_many 和 belongs_to 需要稍微改变以反映您对列名的使用。
    • @Rosh:部分 ("events"."trainer_id" IS NULL) 另外说,params[:id] 中没有值,因此它是 NULL,这就是 Rails 找不到的原因具有 Trainer.find_by_id 的培训师
    猜你喜欢
    • 1970-01-01
    • 2019-11-19
    • 2019-01-01
    • 1970-01-01
    • 2021-02-11
    • 2013-01-01
    相关资源
    最近更新 更多