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_组!成功了!:我不知道我是怎么错过的。