0

有人可以帮我弄清楚我应该在我的 change_default 方法中输入什么代码吗?

我希望能够做这样的事情......

user = User.find(1)
user.companies.first.default!
or 
user.companies.find_by_company_id(2).default!

我的代码:

class Role < ActiveRecord::Base 
  before_save :change_default

  belongs_to :user
  belongs_to :company

  def change_default
    #update default field for to false for current scope
    #Update current record default field to true

    #this is what I currently have, but it's not setting my defaults to false
    if self.default == true
     roles = Roles.where( :user_id => self.user_id) 
     roles.update_all(:default => false)
    end
  end

  def default!
    self.default=true
    self.save
  end

end

class User < ActiveRecord::Base
  has_many :roles
  has_many :companies, :through => :roles
end

class Company < ActiveRecord::Base
  has_many :roles
  has_many :users, :through => :roles
end

代码运行:

pry(main)> a.roles.last.default!

   (0.1ms)  begin transaction
SCOPING
  SQL (0.4ms)  UPDATE "roles" SET "default" = 'f' WHERE "roles"."user_id" = 1
   (2.0ms)  commit transaction
=> true

[5] pry(main)> a.roles

=> [#<Role id: 1, company_id: 1, name: nil, view_document: nil, edit_document: nil, upload_document: nil, delete_document: nil, review_document: nil, company_info: nil, company_clients: nil, company_users: nil, company_admin: nil, created_at: "2014-08-04 20:10:23", updated_at: "2014-08-04 22:29:40", user_id: 1, default: true>,

    #<Role id: 2, company_id: 2, name: nil, view_document: nil, edit_document: nil, upload_document: nil, delete_document: nil, review_document: nil, company_info: nil, company_clients: nil, company_users: nil, company_admin: nil, created_at: "2014-08-04 20:11:10", updated_at: "2014-08-04 20:11:10", user_id: 1, default: nil>,

    #<Role id: 3, company_id: 3, name: nil, view_document: nil, edit_document: nil, upload_document: nil, delete_document: nil, review_document: nil, company_info: nil, company_clients: nil, company_users: nil, company_admin: nil, created_at: "2014-08-04 20:11:14", updated_at: "2014-08-04 22:29:16", user_id: 1, default: true>]

如您所见,更新已运行,但默认值未设置为 false。如果您有任何建议或我可以检查的内容,请告诉我。

4

2 回答 2

1

需要排除正在修改的当前记录。添加了 where.not 子句

  def change_default
    if self.default_changed? && self.default == true
      roles = Role.where( :user_id => self.user_id)
      roles = roles.where.not(:id => self.id)
      roles.update_all(:default => false)  
    end
  end
于 2014-08-04T23:43:17.067 回答
0

看起来在示例中您从不调用save角色。因此,您before_save :change_default没有被执行。也许添加至少role.save会执行,因为我不确定您当前的控制台测试是否实际上正在运行该方法。def default!before_savechange_default

如果我错了并且它实际上正在运行,那么我不确定为什么您的块不会将该default值设置为 false。

于 2014-08-04T23:09:33.883 回答