【问题标题】:Increment/decrement integer in user model by 1将用户模型中的整数递增/递减 1
【发布时间】:2015-05-05 08:39:14
【问题描述】:

我有一个包含这些列的用户模型 - 姓名、电子邮件、books_on_loan

我有一个预订系统,用户可以在其中签出/借入书籍。当用户签出一本书时,我想将他们的 'books_on_loan_ 整数加一,反之亦然。

到目前为止,我已经像这样尝试过,但收到一个错误“nil:NilClass 的未定义方法 `+'” - 它不喜欢 @user.books_on_loan

def check_out

  @params = params[:book]
  title = @params[:title]
  name = @params[:name]
  @book = Book.find_by_title(title)
  @user = User.find_by_name(name)




 if @user == nil
   @note = 'This user is not registered.'
 elsif @book == nil
   @note = 'This book is not in the library.'
 elsif @book.onloan == 1
   @note = 'This book is on loan.'
 elsif @user.books_on_loan == 3
   @note = 'This user already has 3 books out.'

else
  @book.onloan = 1
  @book.save
  @books_loaned = BooksOnloan.create(book_id: @book.id, user_id: @user.id)
  @books_loaned.save
  @user.books_on_loan = @user.books_on_loan + 1
  @user.save
  @note = 'The book was checked out.'
end
respond_to do |format|
  format.html    
  end    
end

【问题讨论】:

  • 用户@user.books_on_loan.to_i,以便在books_on_loan第一次为nil时将nil转换为0跨度>
  • 你应该计算那个值。如果性能有问题,请使用内置的:counter_cache

标签: ruby-on-rails ruby


【解决方案1】:

试试这个:

@user.increment :books_on_loan, 1

【讨论】:

    【解决方案2】:

    您可以尝试使用以下代码,这将处理 @user.books_on_loan 的 nil 值

      @user.books_on_loan = @user.books_on_loan.to_i + 1
    

      @user.books_on_loan = (@user.books_on_loan || 0) + 1
    

      @user.books_on_loan = (@user.books_on_loan.present? ? @user.books_on_loan : 0)  + 1
    

    【讨论】:

      【解决方案3】:

      虽然这里的大多数答案都可以,但您宁愿改变问题的根源否则您必须在整个应用程序中使用保护原因。

      books_on_loan 似乎是 db 中的一个属性,所以这样做:

       change_column :users, :books_on_loan, :integer, default: 0
       #and change existing bad data
       User.update_all({books_on_loan: 0}, {books_on_loan: nil})
      

      或者您可以更改班级中的吸气剂:

      def books_on_loan
        super || 0
      end
      

      旁注,设计方面,在数据库中保存一个整数来维护当前借阅的书籍并不是一个好主意:你可能会松散同步真实的书籍。

      你宁愿算一个真正的关联。

      【讨论】:

        【解决方案4】:

        您的用户在开始时没有加载书籍,但在db 中它没有设置为0 而是nill。因此更改代码行

        @user.books_on_loan = @user.books_on_loan + 1
        

        @user.books_on_loan = (@user.books_on_loan || 0) + 1
        

        如果@user.books_on_loan 为空,它将使用0,并且您的方法+ 不会失败

        【讨论】:

          【解决方案5】:

          只需执行@user.books_on_loan.to_ito_i 会自动将 nil 转换为 0

          【讨论】:

            【解决方案6】:

            大部分答案都非常正确,但我想补充以下内容。

            要回答您的问题,可以通过以下方式增加属性的值(即使是在返回 nil 的变量上):

            @user.books_on_loan =+ 1

            递减是:@user.books_on_loan =- 1

            但是,您可以在此处利用适当模型关联的好处,并在 UserBook 之间建立 has_many -> through 关系,其中为用户添加/删除一本书,计数器会相应调整。

            【讨论】:

              【解决方案7】:

              Rails 提供了可以使用的实用抽象:incrementdecrement。 所以你现在可以这样做:

              @user.increment(:books_on_loan, 1)
              

              增量需要 2 个参数。表格列和您递增的数字。如果为 nil,它将属性初始化为零,并添加传递的值(默认为 1)。

              同样你可以使用

              @user.decrement(:book_on_loan, 1)
              

              更多关于HERE

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2016-04-05
                • 2022-11-19
                • 2020-08-18
                • 1970-01-01
                • 1970-01-01
                • 2012-04-29
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多