在ruby中以多对多关系分配角色的最佳实践是什么?

时间:2012-01-16 20:46:14

标签: ruby-on-rails activerecord methods action

我正在尝试建立一个足球游戏来试验红宝石。协会如下:

Match.rb

class Match < ActiveRecord::Base
  belongs_to :home_user, :class_name => 'User', :foreign_key => 'home_user_id'
  belongs_to :away_user, :class_name => 'User', :foreign_key => 'away_user_id'

User.rb

class User < ActiveRecord::Base
  has_many :home_matches, :class_name => 'Match', :foreign_key => 'home_user_id'
  has_many :away_matches, :class_name => 'Match', :foreign_key => 'away_user_id'

我的问题是我如何为匹配分配home_user和away_user?我想到了一个初始化方法,如:

  def initialize(home_user, away_user)
    @home_user = User.find(1)
    @away_user = User.find(2)
  end

但是如何让代码找到决定匹配的用户和提供匹配的用户?我想我应该在用户点击“set_match”链接并将这些user_ids发送到方法时定义它们但是如何?问题是红宝石是我学习的第一个OOL。我已经学习了类和对象以及封装和变量等。但是需要有关方法的进一步指导。提前谢谢。

1 个答案:

答案 0 :(得分:1)

我不会使用initialize方法,因为当你的模型继承ActiveRecord :: Base时,它有一个很好的初始化方法来设置所有属性。

但是,你可以这样做。

def set_users(home_user, away_user)
  if home_user && away_user
    self.home_user = User.find(home_user)
    self.away_user = User.find(away_user)
    true
  else
    false
  end
end

然后在您的控制器中

def update
  @match = Match.find(params[:id])
  if @match.set_users(params[:home_user_id], params[:away_user_id])
    @match.save
  else
    @match.update_attributes(params[:match])
  end
end

我基本上设置了它,所以匹配控制器上的更新操作将接受一个选项来更新用户关系,或者只接受更新参数的常用哈希值。