在Rails 3中为has_many:through关系创建控制器和视图

时间:2011-11-09 01:08:20

标签: ruby-on-rails ruby view controller has-many-through

有许多教程向您展示如何在Rails中为has_many:through关系创建模型指令,但似乎没有很多文章与设置表单以创建和编辑这些关系的过程相关。我正在寻求一些帮助(或很好的例子),说明如何创建一个允许用户在Rails应用程序中管理这些类型关系的界面。

以下是该方案:

  

我有用户,关系和运动员。用户可以拥有   与运动员在各种角色的关系:教练,导师,   家长或粉丝。

以下是我的模特:

class User < ActiveRecord::Base
  has_many :relationships
  has_many :athletes, :through => :relationships
end

class Athlete < ActiveRecord :: Base
  has_many :relationships
  has_many :users, :through => :relationships
end

class Relationship < ActiveRecord :: Base
  belongs_to :users
  belongs_to :athletes
end

因此,下一步是构建视图和控制器,允许我创建用户与运动员的关系(与教练,父母等角色),编辑关系或破坏关系。

最终,我的目标是让用户可以创建运动员并选择相关关系。

不幸的是,我找不到任何特定的教程或参考资料,它比模型说明或has_many关系的示例更多。

如果有人有一个可以在简单的级别上解决这个问题的链接或示例,我应该可以自定义其余部分。

2 个答案:

答案 0 :(得分:5)

您在此处与用户和运动员模型之间的关系基本上是has_and_belongs_to_many关系(HABTM)。通过和你一起来回看,你似乎对创造这些关系的最佳方式感到困惑。

开始阅读的好地方将在ActiveRecord协会的文档中,特别是the documentation for HABTM relationships

你的模型设置很好。现在您已经建立了HABTM关系,这就是您可以做的事情。让我们假设您的运动员和用户模型都非常简单,只有name属性,这是一个字符串。您现在可以执行此类代码(这是rails控制台的控制台输出):

User.create(:name => "Jeff")
usr = User.first
=> #<User id: 1, name: "Jeff">
usr.athletes
=> []
atl = usr.athletes.create(:name => "Mike")
=> #<Athlete id: 1, name: "Mike">

上面的行将创建一个名为Mike的用户,并自动创建一个具有相应属性的关系条目以链接这两者。所以现在如果你这样称呼:

usr.athletes
=> [#<Athlete id: 1, name: "Mike">]

现在,如果您想让用户决定他们与创建运动员的运动员之间的关系,您可以将您的关系类设置为relation类型为string的字段,并且在创建关系时(如上所示),您可以执行以下操作:

rel = usr.relationships.where(:user_id => usr.id, :athlete_id => atl.id).first
=> #<Relationship id: 1, user_id: 1, athlete_id: 2, :relation => nil>
rel.relation = "Friend"
rel.save
=> #<Relationship id: 1, user_id: 1, athlete_id: 2, :relation => "Friend">

希望这比我原来的答案更有帮助。如果您有任何疑问,请告诉我。当然,请务必查看我上面提到的ActiveRecord Associations文档。

答案 1 :(得分:0)

尝试使用railscast或ascii强制转换。这就是我经常开始的地方。不确定这是否属于您之后的问题,但是这些网站上有嵌套表单的教程。我认为它处于复杂的形式。无论如何,值得阅读/观看。