数据库中的切换属性

时间:2012-08-03 05:38:30

标签: ruby-on-rails database oauth boolean

如果用户未注册twitter或facebook,则提供者属性为空,用户为专业用户。我已将pro属性作为布尔值添加到数据库中,默认值为false。

我正在尝试使用下面的代码将数据库中的pro属性切换为true。

  def pro?
    toggle!(:pro) if provider.blank? 
  end

但是我收到了这个错误。

stack level too deep

我也试过了       def pro?         :pro =>如果provider.blank,则为true?       结束 但得到这个错误:

 syntax error, unexpected tASSOC, expecting keyword_end

注意我还需要使用pro方法,因为它在代码中的许多其他地方使用。

4 个答案:

答案 0 :(得分:1)

例如,在ActiveRecord数据库({1}}上定义布尔列时,您可以免费获得:pro方法。当您以这种方式覆盖pro?时,它会引发pro?。因此,请考虑重命名您的方法,例如:

stack level too deep

答案 1 :(得分:1)

def toggle_pro
  self.pro = !self.pro if provider.blank?
  self.save!
end

答案 2 :(得分:1)

如果您将pro属性定义为布尔值,则以下方法均可免费使用:

  • pro?:返回pro属性
  • 的布尔值
  • pro=:设置pro
  • 的值

?结尾的ruby方法应该返回一个布尔值,没有任何副作用。

在您的情况下,我会做的是添加一个回调:

class User

  before_save :check_pro_status

  def check_pro_status
    pro = provider.blank?
  end

end

这将确保您user每次更改某些内容时,在保存之前,它会根据提供商正确设置pro - 状态。

希望这有帮助。

答案 3 :(得分:0)

现在您只需使用 ActiveRecord#toggle 方法切换布尔字段

例如:

@user.toggle!(:pro)

如果您的记录为false,那么它将变为true,反之亦然。如果您使用save,则无需对您的对象进行update / toggle!调用。

注意:该方法会跳过验证和回调。属性必须作为符号传递。