我有一个'小费'模型和一个'团队'模型。我正在尝试创建一个表单,用户将从几个游戏中选择获胜的团队。到目前为止,用户可以选择获胜团队,并将这些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。这是一个与我的测试数据相关的愚蠢错误让我想到了。
答案 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”获取它