用户模型中的递增/递减整数为1

时间:2015-05-05 08:39:14

标签: ruby-on-rails ruby

我有一个包含这些列的用户模型 - name,email,books_on_loan

我有一个预订系统,用户可以在这里查看/阅读书籍。当用户检查书籍时,我想将他们的'books_on_loan_整数增加1,反之亦然。

到目前为止,我已经尝试过这样做了,并且收到错误“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

6 个答案:

答案 0 :(得分:1)

试试这个:

@user.increment :books_on_loan, 1

答案 1 :(得分:1)

您可以尝试使用以下代码,这些代码将处理@ 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

答案 2 :(得分:1)

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

似乎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

旁注,设计明智,在db中保留当前书籍的整数并不是一个好主意:你可以松开同步真实的书籍。

你宁可算一个真正的联想。

答案 3 :(得分:0)

您的用户在开始时没有加载图书,但在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为nill,则会使用0,您的方法+不会失败

答案 4 :(得分:0)

ost答案非常正确,但我想补充以下内容。

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

@user.books_on_loan =+ 1

递减:@user.books_on_loan =- 1

但是,您可以在此处利用正确的模型关联,并拥有 has_many - >通过 用户预订之间的关系,通过为用户添加/删除图书,相应地调整计数器。

答案 5 :(得分:0)

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

@user.increment(:books_on_loan, 1)

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

同样可以使用

@user.decrement(:book_on_loan, 1)

有关此HERE

的更多信息