如何在Rails中将现有模型与新模型相关联

时间:2012-10-07 03:21:04

标签: ruby-on-rails rails-activerecord

我有一个'小费'模型和一个'团队'模型。我正在尝试创建一个表单,用户将从几个游戏中选择获胜的团队。到目前为止,用户可以选择获胜团队,并将这些ID保存为Tip模型(team_id)中的foriegn键。但保存后,我不能去(例如)@ tip.team.name。我需要做什么 ?我如何关联它(虽然如果设置了foriegn键,我可以神奇地使用rails),我对rails很新。谢谢你的帮助!

class Tip < ActiveRecord::Base
attr_accessible :user_id, :team_id, :team, :game_id, :game, :comp, :comp_id
belongs_to   :game
belongs_to   :comp
belongs_to   :team
end

class Team < ActiveRecord::Base
attr_accessible :name
has_many   :tips
end

def create
params['game'][0].each do |key, value|
    @tip = Tip.new
    @tip.team_id = value
    @tip.game_id = key
    @tip.save
end

这最后一种方法也可能很混乱,但不确定如何做到这一点。我想在一种形式中创建几个“提示”。

编辑:要明确我很确定这是一对多的关系,我在一个表单中创建了几个提示,但每个提示只与一个团队有关。

编辑:实际上我的方法(我肯定不接近最好的方法,确实允许tip.team.name。这是一个与我的测试数据相关的愚蠢错误让我想到了。

2 个答案:

答案 0 :(得分:2)

您真正需要的是使用has_many through关系来链接提示和团队。这是因为一个小技巧可以拥有很多团队,但也有一个团队可以提供很多提示。您需要创建第三个表来执行此操作,可能名为TeamsTips。您可以通过以下方式进行设置:

class Tip < ActiveRecord::Base
  has_many :teams_tip
  has_many :teams, :through => :teams_tip
end

class TeamsTip < ActiveRecord::Base
  belongs_to: teams
  belongs_to: tips
end

class Team < ActiveRecord::Base
  has_many :teams_tip
  has_many :tips, :through => :teams_tip
end

现在有了@tip,你可以用@ tip.teams找到它的所有团队。请记住,这将是一个数组,以便让第一个团队使用@tick.teams [0]。同样,如果你有@team,你可以使用@ team.tips获得它的所有提示。

有关如何通过关联设置此has_many的更多信息,请参阅A Guide to Active Record Associations

答案 1 :(得分:1)

如果你的联想是“提示属于一个团队”而“团队可以有很多提示”,那么问题中定义的关联是正确的。

如果您想在创建团队时创建多个提示或添加/编辑/删除已创建团队的提示,请查看“accepts_nested_attributes_for”和https://github.com/ryanb/nested_form

如果您可以使用'@ team.name'获取团队名称,那么您应该使用“@ tip.team.name”获取它