嵌入式关联没有持久化

时间:2013-12-31 10:10:58

标签: ruby-on-rails activerecord associations

我跟随this tutorial了解为用户分配角色的完全相同的用例。

我正在使用Rails 3.2.16

当我尝试从pry控制台测试角色分配时,我得到roles的{​​{1}}字段未更新。

这是撬文:

User

以下是该模型的相关方法:

[14] pry(main)> a = User.last
  User Load (0.3ms)  SELECT `users`.* FROM `users` ORDER BY `users`.`id` DESC LIMIT 1
=> #<User id: 7, email: "a@b.c", encrypted_password: "...", reset_password_token: nil, reset_password_sent_at: nil, remember_created_at: nil, sign_in_count: 1, current_sign_in_at: "2013-12-29 11:14:36", last_sign_in_at: "2013-12-29 11:14:36", current_sign_in_ip: "127.0.0.1", last_sign_in_ip: "127.0.0.1", created_at: "2013-12-29 11:14:04", updated_at: "2013-12-31 09:50:26", username: "asf", confirmation_token: nil, confirmed_at: "2013-12-29 11:14:26", confirmation_sent_at: "2013-12-29 11:14:04", unconfirmed_email: nil, roles_mask: 0>
[15] pry(main)> a.roles = [:admin, :expired]
=> [:admin, :expired]
[16] pry(main)> a.save
   (0.1ms)  BEGIN
   (0.1ms)  COMMIT
=> true

这是迁移:

ROLES = %w[admin active expired]

  def roles=(roles)
    self.roles_mask = (roles & ROLES).map { |r| 2**ROLES.index(r) }.sum
  end

  def roles
    ROLES.reject { |r| ((roles_mask || 0) & 2**ROLES.index(r)).zero? }
  end

  def role_symbols
    roles.map(&:to_sym)
  end

你知道为什么协会不会在这里持续存在吗?

提前多多感谢。

1 个答案:

答案 0 :(得分:0)

我认为我在roles=方法中使用符号匹配字符串,但这不起作用。

我现在已将所有内容转换为符号,并且效果很好。

这是新代码:

  ROLES = [:admin, :active, :expired]

  def roles=(roles)
    self.roles_mask= (roles & ROLES).map { |r| 2**ROLES.index(r) }.sum
  end

  def roles
    roles_symbols.reject { |r| ((roles_mask || 0) & 2**ROLES.index(r)).zero? }
  end