【问题标题】:Creating controllers and views for a has_many :through relationship in Rails 3在 Rails 3 中为 has_many :through 关系创建控制器和视图
【发布时间】:2011-12-24 22:42:02
【问题描述】:

有很多教程向您展示了如何在 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 关系示例之外,我找不到任何具体的教程或参考资料。

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

【问题讨论】:

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


    【解决方案1】:

    您的用户和运动员模型之间的关系本质上是has_and_belongs_to_many 关系 (HABTM)。通过与您来回走动,您似乎对建立这些关系的最佳方式感到困惑。

    ActiveRecord 的关联文档是一个很好的起点,特别是 the documentation for HABTM relationships

    你的模型设置很好。既然您已经设置了 HABTM 关系,那么您可以执行以下操作。假设您的 Athlete 和 User 模型都非常简单,并且只有一个 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">]
    

    现在,如果您想允许用户在创建运动员时指定他们与运动员之间的关系,您可以设置您的关系类以具有类型为 stringrelation 字段,并在创建关系时(正如我刚刚在上面显示的那样),然后您可以执行以下操作:

    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 关联文档。

    【讨论】:

    • 是的,我确实看过那个例子,但从解释的角度来看,它并不是一个很好的例子;虽然它可能是唯一使用的。
    • 我想我有点不清楚您希望该网站如何工作。也许在 Athlete#Show 页面中,用户视图有一些东西,他们可以在其中按下按钮来触发表单来显示,这允许他们提交带有文本字段的表单,其中将添加关系并指示与文本字段中的运动员?抱歉,如果没有对所需功能进行更全面的解释,这是我能做的最好的事情。
    • 简而言之,我必须构建一个表单,用户可以在其中创建一个运动员,然后指出他们想要的关系角色(教练、父母等)。对于多对一关联,Rails 表单似乎很简单,但是关于如何为多对多构建视图和控制器的示例并不多(我发现了)。我可能让这太难了,但我仍在试图找出做这些事情的“轨道方式”。我可以在睡梦中用 PHP 做到这一点。
    • 在我看来,您最初的问题似乎是在询问一种在 UI 意义上执行此操作的好方法...您是在问如何进行编码或如何实现 UI?
    • 我主要是在询问控制器,因为我认为如果我知道如何引用控制器中的所有三个关系,我就可以弄清楚视图。
    【解决方案2】:

    试试 railscasts 或 ascii casts。这就是我通常开始的地方。不确定这是否是您所追求的,但这些网站上有嵌套表单的教程。我认为它是在复杂的形式下。无论如何都值得阅读/观看。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多