需要帮助将数据从一个模型链接到另一个模型

时间:2012-03-29 01:30:40

标签: ruby-on-rails asp.net-mvc

我正在开发一款寻宝游戏,我被困住了。因此,我为狩猎和与狩猎相关的任务设置了CRUD。但我不知道如何设置它以便用户可以将特定任务与特定的搜索相关联。我认为我已经正确设置了模型,但我不确定如何设置允许这种任务关联与狩猎的视图。

class Hunt < ActiveRecord::Base

  has_many :tasks
  attr_accessible :name
  validates :name,  :presence => true,
                    :length   => { :maximum => 50 } ,
                    :uniqueness => { :case_sensitive => false }

end


class Task < ActiveRecord::Base

  belongs_to :hunts
  attr_accessible :name
  validates :name,  :presence => true,
                    :length   => { :maximum => 50 } ,
                    :uniqueness => { :case_sensitive => false }

end

我猜我需要编写一个显示搜索的视图,然后列出所有可用的任务。然后我需要一种方法让用户“选择”一个任务并将其添加到一个狩猎。这是我最后一部分难以理解的。

3 个答案:

答案 0 :(得分:2)

  

我猜我需要编写一个显示搜索的视图,然后列出所有可用的任务。然后我需要一种方法让用户“选择”一个任务并将其添加到一个狩猎。这是我最后一部分难以理解的。

以上暗示has_and_belongs_to_many*..*之间存在HuntTask)关系,而不是has_many(因为Hunt可以与多个任务相关联)并且一个任务可以属于你系统中的多个Hunts。

你可以选择:

class Hunt < ActiveRecord::Base
  [...]
  has_and_belongs_to_many :tasks
  [...]
end # Hunt

class Task < ActiveRecord::Base
  [...]
  has_and_belongs_to_many :hunts
  [...]
end

这样做可以让您关联多个任务(或者如果需要,您可以只关联一个),并且还有一个任务属于多个Hunts。此外,您可以使用简单的f.select表单标记帮助程序来呈现系统中可用任务的列表。

希望这有帮助。

答案 1 :(得分:1)

一些好的信息来源是:

  1. Ruby on Rails Guides: ActionView Helpers - 提供了一个很好的起点和概述

  2. Blog on dealing with Categories - 讨论使用从关联表派生的类别并在视图中显示它们

  3. Rails Casts Nested Model - 这显示了如何处理嵌套或has_many关系。

  4. 现在关于添加任务和添加搜索的问题,使用嵌套属性的表单,您可以拥有一个显示任务的视图,允许添加搜索。添加操作可能需要一些Javascript(如RailsCasts中所示),或者具有在控制器中执行 hunt.tasks.build 的弹出窗口。关联上的构建将当前的搜索ID分配给创建的任务。

    现在,如果您有预先分配给寻线的任务列表,则需要让表单显示属于寻线的任务的选择列表。使用模型定义中的嵌套属性,如:

    class Hunt < ActiveRecord::Base
      has_many :tasks
      accepts_nested_attributes_for :tasks
    end
    
    class Task < ActiveRecord::Base
      belongs_to :hunts
    end
    

    所以现在在表单提交上,params将与相关的任务id嵌套发布,允许你执行update_attributes。

    更多详细信息在Rails API accepts nested attributes中,RailsCast参考将逐步给出示例。

答案 2 :(得分:0)

belongs_to课程中的Task声明应该是:hunt,而不是:hunts

就观点而言,它非常简单。只需在f.select上使用f(假设您的表单助手变量名称为:hunt_id),并更新hunt_id内的Task属性。

这会将HuntTask相关联。

请务必查看options_for_select,以便在表单中显示Hunt名称和hunt_id选项值。我还建议阅读关于协会的Rails指南:http://guides.rubyonrails.org/association_basics.html