gpt4 book ai didi

ruby-on-rails - 如何使用 has_and_belongs_to_many 将新模型与现有模型相关联

转载 作者:数据小太阳 更新时间:2023-10-29 07:07:22 25 4
gpt4 key购买 nike

我有两个使用 has_and_belongs_to_many 建立多对多关系的模型。像这样:

class Competition < ActiveRecord::Base
has_and_belongs_to_many :teams
accepts_nested_attributes_for :teams
end

class Team < ActiveRecord::Base
has_and_belongs_to_many :competitions
accepts_nested_attributes_for :competitions
end

如果我们假设我已经在数据库中创建了多个竞赛,当我创建一个新团队时,我想使用嵌套表单将新团队与任何相关竞赛相关联。

正是在这一点上,我确实需要帮助(已经坚持了几个小时!)我认为我现有的代码已经以错误的方式解决了这个问题,但我会展示它以防万一:

class TeamsController < ApplicationController
def new
@team = Team.new
@competitions.all
@competitions.size.times {@team.competitions.build}
end
def create
@team = Team.new params[:team]
if @team.save
# .. usual if logic on save
end
end
end

还有 View ...这是我真正卡住的地方,所以到目前为止我不会同时发布我的努力。我想要的是每个比赛的复选框列表,以便用户可以只选择适合的比赛,而不选中不适合的比赛。

我真的被这个问题困住了,非常感谢您提供的任何指向正确方向的信息:)

最佳答案

将模型连接在一起的 has_and_belongs_to_many 方法已弃用,取而代之的是新的 has_many ... :through 方法。管理存储在 has_and_belongs_to_many 关系中的数据非常困难,因为 Rails 没有提供默认方法,但 :through 方法是一流的模型,可以这样操作。

由于它与您的问题有关,您可能希望这样解决它:

class Competition < ActiveRecord::Base
has_many :participating_teams
has_many :teams,
:through => :participating_teams,
:source => :team
end

class Team < ActiveRecord::Base
has_many :participating_teams
has_many :competitions,
:through => :participating_teams,
:source => :competition
end

class ParticipatingTeam < ActiveRecord::Base
belongs_to :competition
belongs_to :team
end

当涉及到自己创建团队时,您应该构建表单,以便将您收到的参数之一作为数组发送。通常,这是通过将所有复选框字段指定为相同名称来完成的,例如“competitions[]”,然后将每个复选框的值设置为比赛的 ID。然后 Controller 看起来像这样:

class TeamsController < ApplicationController
before_filter :build_team, :only => [ :new, :create ]

def new
@competitions = Competitions.all
end

def create
@team.save!

# .. usual if logic on save
rescue ActiveRecord::RecordInvalid
new
render(:action => 'new')
end

protected
def build_team
# Set default empty hash if this is a new call, or a create call
# with missing params.
params[:team] ||= { }

# NOTE: HashWithIndifferentAccess requires keys to be deleted by String
# name not Symbol.
competition_ids = params[:team].delete('competitions')

@team = Team.new(params[:team])

@team.competitions = Competition.find_all_by_id(competition_ids)
end
end

为复选框列表中的每个元素设置选中或未选中的状态是通过以下方式完成的:

checked = @team.competitions.include?(competition)

其中“竞争”是被迭代的那个。

您可以轻松地在比赛列表中添加和删除项目,或者简单地重新分配整个列表,Rails 将根据它找出新的关系。您的更新方法看起来与新方法没有太大区别,只是您使用的是 update_attributes 而不是 new。

关于ruby-on-rails - 如何使用 has_and_belongs_to_many 将新模型与现有模型相关联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2108951/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com