【问题标题】:rails 4 - using has_and_belongs_to_many associationrails 4 - 使用 has_and_belongs_to_many 关联
【发布时间】:2014-05-22 00:52:11
【问题描述】:

我有两种类型的数据:TeamGame。一支球队可以属于多个比赛(例如,一所大学可以打篮球、足球和足球),而每场比赛自然有许多球队在联盟中参赛。

class Game < ActiveRecord::Base
  has_and_belongs_to_many :teams
end

class Team < ActiveRecord::Base
  has_and_belongs_to_many :games
end

数据库中有一个表,其中包含两列来保存这些关系:

create_table "games_teams", id: false, force: true do |t|
  t.integer "game_id"
  t.integer "team_id"
end

到目前为止一切顺利。

我需要构建一个表单来添加新的Teams,但我无法正确显示Game

<%= form_for @team, :html => {:class => 'form-horizontal form', :role => 'form'} do |f| %>
  <%= f.collection_select(:game_id, Game.all, :id, :name) %>

这会引发错误undefined method game_id for #&lt;Team:0x007fa1af68f2d8&gt;

如何在使用Team 对象时正确插入game_id,在添加Game 时如何正确插入team_id?我意识到这些应该处理“多选”场景,但目前我无法让它工作。

谢谢!

【问题讨论】:

  • 什么是Commodity?你确定@team 有团队,Game.all 会返回游戏吗?
  • @fotanus-- 抱歉,错字-- 'commodity' 是错误中的名称,我更改了实际数据的名称以使其更清楚我在说什么。

标签: ruby-on-rails ruby ruby-on-rails-4


【解决方案1】:

您正在寻找的答案是改用game_ids[]

#View
<%= f.collection_select(:game_ids, Game.all, :id, :name) %>

#Controller
def create
   @team = Team.new(Team_params)
   @team.save
end

private

def team_params
    params.require(:team).permit(game_ids: [])
end

这应该设置has_and_belongs_to_many 数据的集合值。当我进入办公室时,我必须对此进行测试 - 它确实有效,但语法是否正确是我必须找到的

【讨论】:

    【解决方案2】:

    collection_select 的第一个参数是来自所描述对象的属性。所以,这一行

    f.collection_select(:game_id, Game.all, :id, :name)

    尝试在对象team 上调用game_id,但失败。

    我不确定是否有 Rails 支持的直接方法来帮助您构建这种关联。您始终可以使用select_tagoptions_for_select 构建解决方案(使用mutiple: true,因为它是has_and_belongs_to_many,将一组game_ids 发送到您的操作并手动处理它。

    你也可以看看这个rails cast

    【讨论】:

      【解决方案3】:

      尝试使用关联而不是 collection_select

      <%= form_for @team, :html => {:class => 'form-horizontal form', :role => 'form'} do |f| %>
          <%= f.association :game, collection: Game.all.map{|p| [p.id, p.name]}, :label => 'Drive', :prompt => "Select Game" %>
      

      【讨论】:

      • @anusha-- 这返回了undefined method association for #&lt;ActionView::Helpers::FormBuilder:0x007fb06bddd308&gt;
      • 哦,实际上我已经用简单的形式使用了这个关联输入,但这里你使用 form_for。请尝试使用“simple_form_for”simple_form gem。检查此链接以供参考:github.com/plataformatec/simple_form
      • @anusha-- 我宁愿先用普通的导轨来做,这样我就可以在安装更多的 gem 之前了解它在做什么,而这些 gem 会掩盖它的真正工作原理。不过谢谢!
      【解决方案4】:

      我相信你想使用 has_many through 而不是 has_and_belongs_to_many。喜欢:

      class Game < ActiveRecord::Base
        has_many :game_teams
        has_many :teams, :through => :game_teams
      end
      
      class Team < ActiveRecord::Base
        has_many :game_teams
        has_many :games, :through => :game_teams
      end
      

      【讨论】:

      • 两者有什么不同?
      • 看起来是一样的。 guides.rubyonrails.org/…
      • @MikeS-- 我会试一试,虽然我相信当中间表有自己的模型时使用through -- 否则使用has_and_belongs_to_many
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-12
      • 2013-12-23
      相关资源
      最近更新 更多