【问题标题】:What is the best practice to assign roles in a many-to-many relationship in ruby?在 ruby​​ 中以多对多关系分配角色的最佳实践是什么?
【发布时间】:2012-02-11 18:00:53
【问题描述】:

我正在尝试构建一个足球游戏来试验 ruby​​。关联如下:

匹配.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'

用户.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 发送到方法时定义它们,但是如何?问题是 ruby​​ 是我正在学习的第一个 OOL。我已经学习了类和对象以及封装和变量等。但需要有关方法的进一步指导。提前谢谢你。

【问题讨论】:

    标签: ruby-on-rails activerecord methods action


    【解决方案1】:

    我不会使用初始化方法,因为当您的模型子类化 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
    

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

    【讨论】:

    • 有错字吗,我的意思是,不应该是self.home_user = User.find(home_user_id) 而不是self.home_user = User.find(home_user) 吗?尽管如此,我还是得到了语法。非常感谢。但只是最后一个问题:为什么你使用 update 方法而不是 create 或 new 方法?在我看来,new 和 create 方法(以及回调)之间的区别看起来很复杂。
    • 因为我有名为 home_user 和 away_user 的变量,所以它工作正常。这些被传递到 find 方法中。您可以将它们重命名为 _id,这可能更有意义。我假设匹配是存在的。如果您正在创建一个新用户并同时选择用户,那么您几乎可以使用在脚手架之后获得的默认创建操作。实际上,您也可以保留更新默认值,只要您将字段名称传递为 :home_user_id 和 :away_user_id。我只是想展示如何自己分配对象。
    • 抱歉,回复晚了,但我想我理解了更新内容,但误解了 def set_users 中的 away_user_id。如果self.away_user_id = User.find(away_user),那么我需要找到一种方法将其他用户(对手的)ID分配给对手选择视图中的@away_user_id实例变量(可以说是matches/new.html.erb),这将调用控制器中的更新或新方法,对吗?但是如果匹配/新视图属于匹配模型而不属于用户模型,这将如何?
    • 哦,你是对的,这是我的错误。我很抱歉我错过了。
    猜你喜欢
    • 2014-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-17
    • 2011-02-05
    • 1970-01-01
    相关资源
    最近更新 更多