Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails 3上奇怪的关系行为和更新_属性_Ruby On Rails_Ruby_Rspec_Has Many_Has One - Fatal编程技术网

Ruby on rails Rails 3上奇怪的关系行为和更新_属性

Ruby on rails Rails 3上奇怪的关系行为和更新_属性,ruby-on-rails,ruby,rspec,has-many,has-one,Ruby On Rails,Ruby,Rspec,Has Many,Has One,我很难找出考试失败的原因: describe User, "Instance Methods" do describe "leave_group!" do it "should set group_id to nil" do @user = Factory(:user) @group_2 = Factory(:group, :owner => @user) @user.leave_group! @user.reload.grou

我很难找出考试失败的原因:

describe User, "Instance Methods" do
  describe "leave_group!" do
    it "should set group_id to nil" do
      @user = Factory(:user)
      @group_2 = Factory(:group, :owner => @user)

      @user.leave_group!
      @user.reload.group_id.should be_nil # THIS LINE IS FAILING!!!
    end

    it "should assign another owner to group, if owner was user" do
      @user = Factory(:user)
      @group = Factory(:group, :owner => @user)
      1.upto(4) { @group.add_user Factory(:user) }

      @user.leave_group!
      @group.reload.owner.should_not eql(@user)
    end
  end
end
以下是我正在使用的模型:

class User < ActiveRecord::Base
  # Associations
  has_one :own_group, :class_name => "Group", :foreign_key => "owner_id"
  belongs_to :group

  def leave_group!
    current_group_id, current_group_owner = self.group.id, self.group.owner
    self.group_id = nil
    save!
    Group.find(current_group_id).randomize_owner! if current_group_owner == self
  end
end

class Group < ActiveRecord::Base
  # Associations
  has_many :users
  belongs_to :owner, class_name: "User"

  def randomize_owner!
    current_users = self.users
    return false unless current_users.length > 1
    begin
      new_user = current_users.sort_by { rand }.first
    end while self.owner == new_user
    self.owner_id = new_user.id
    save!
  end
end

最后3行都是selects,注意rails甚至没有尝试从用户中删除group_id。(有两个插入,一个用于测试用户,一个用于测试组,还有一个用于将组id分配给测试用户的更新)。

尝试按如下方式创建模型类:

class User < ActiveRecord::Base
  # Associations
  has_one :own_group, :class_name => "Group", :foreign_key => "owner_id"
  belongs_to :group

  def leave_group!
    group_randomize_owner
    self.group.clear
  end

  private

  def group_randomize_owner
    if group.owner == self
      group.randomize_owner!
    end
  end
end
class用户“组”,:foreign\u key=>“所有者id”
属于:组
def离开团队!
组\u随机化\u所有者
自组清除
结束
私有的
def组\u随机化\u所有者
如果group.owner==self
组。随机化您的所有者!
结束
结束
结束

尝试按以下方式尝试模型类:

class User < ActiveRecord::Base
  # Associations
  has_one :own_group, :class_name => "Group", :foreign_key => "owner_id"
  belongs_to :group

  def leave_group!
    group_randomize_owner
    self.group.clear
  end

  private

  def group_randomize_owner
    if group.owner == self
      group.randomize_owner!
    end
  end
end
class用户“组”,:foreign\u key=>“所有者id”
属于:组
def离开团队!
组\u随机化\u所有者
自组清除
结束
私有的
def组\u随机化\u所有者
如果group.owner==self
组。随机化您的所有者!
结束
结束
结束

尝试添加一个
@user。在
@user之前重新加载
调用。将组留在测试中


即使当您从工厂创建
@group_2
时,用户记录在数据库中用它的组更新,我怀疑
@user
对象不是。然后你呼叫
离开团队
@user
组ID
为nil,因此由于对象未更改,因此保存不会执行任何操作。然后在测试的下一行中,重新加载
@user
,该用户现在具有先前分配的DB中的
组id

尝试添加
@user。在
@user之前重新加载
调用。将\u组
保留在测试中


即使当您从工厂创建
@group_2
时,用户记录在数据库中用它的组更新,我怀疑
@user
对象不是。然后你呼叫
离开团队
@user
组ID
为nil,因此由于对象未更改,因此保存不会执行任何操作。然后在测试的下一行中,重新加载
@user
,它现在具有前面分配的DB中的
组id

请为第一个测试添加logs/test.log的输出,包括SQL查询。我刚刚添加了它们。请注意,rails甚至没有尝试进行任何插入或更新,尽管它应该进行两次更新(一次用于从用户删除组id,另一次用于向组分配另一个所有者id)。请为第一次测试添加logs/test.log的输出,包括SQL查询。我刚刚添加了它们。请注意,rails甚至不尝试进行任何插入或更新,即使它应该进行两次更新(一次用于从用户中删除组id,另一次用于为组分配另一个所有者id)。这将不起作用:self.group.clear将抛出错误,因为它将尝试调用实际上不是方法的组#clear。但是,这将对以下组起作用:@group.users.clear,但这不是我需要解决的问题。谢谢你的帮助!这不起作用:self.group.clear将抛出一个错误,因为它将尝试调用group#clear,这实际上不是一个方法。但是,这将对以下组起作用:@group.users.clear,但这不是我需要解决的问题。谢谢你的帮助!非常感谢你!我改变了@user.leave\u组!发送至@user.reload.leave_组!成功了!:我不知道我是怎么错过的。非常感谢!我改变了@user.leave\u组!发送至@user.reload.leave_组!成功了!:我不知道我是怎么错过的。