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

Ruby on rails 在ruby中,在多对多关系中分配角色的最佳实践是什么?,ruby-on-rails,activerecord,methods,action,Ruby On Rails,Activerecord,Methods,Action,我正在尝试用ruby制作一个足球游戏。这些协会如下: 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' 但是如何使用代

我正在尝试用ruby制作一个足球游戏。这些协会如下:

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'

但是如何使用代码找到决定匹配的用户和提供匹配的用户呢?我想我应该在用户单击“set_match”链接时定义它们,并将这些用户ID发送给该方法,但是如何定义呢?问题是ruby是我学习的第一个工具。我已经学习了类和对象、封装和变量等。。但需要进一步的方法指导。提前谢谢。

我不会使用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

我基本上是这样设置的,所以match controller上的更新操作将接受一个选项来更新用户关系,或者只接受通常的更新参数散列。

是否有输入错误,我的意思是,它不应该是
self.home\u user=user.find(home\u user\u id)
而不是
self.home\u user=user.find(home\u user)
?尽管如此,我还是理解了语法。非常感谢你。但最后一个问题是:为什么使用update方法而不是create或new方法?new方法和create方法(以及回调)之间的区别在我看来很复杂,因为我有名为home\u user和away\u user的变量,所以效果很好。这些正在传递到find方法中。您可以将它们重命名为_id,这可能更有意义。我采取行动的前提是这场比赛是存在的。如果您正在创建一个新的,并且同时选择了用户,那么您几乎可以使用脚手架之后得到的默认创建操作。实际上,您也可以保留更新默认值,只要您将字段名传递为:home_user_id和:away_user_id。我只是想展示如何分配对象本身。很抱歉响应太晚,但我想我理解了更新内容,但误解了def set_users中的away_user_id。如果
self.away\u user\u id=user.find(away\u user)
,那么我需要找到一种方法,将其他用户(对手)的id分配给对手选择视图(matches/new.html.erb)中的@away\u user\u id实例变量,该变量将调用控制器中的update或new方法,对吗?但是如果matches/new视图属于match模型而不是用户模型,这将是怎样的呢?哦,你是对的,这是我的一个错误。对不起,我错过了。
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