在编程方面,我有点慢,但我很喜欢并尽可能多地学习。如果我对我的问题不够清楚,请提前道歉。
我有一个专门用于DJ的应用程序,用于查看按州分组的歌曲和歌曲评论。 5 Fields ... songid,state,stdjlike,stthinkclublike,stplait(我知道可怕的名字,但它们帮助我记住它们是什么:))。
一旦用户决定复习一首歌,他们将被问到3个问题,这些问题以1到5的等级回答,该表格收集3个答案以及用户状态和歌曲的ID。大多数情况下,数据库只会找到状态和歌曲ID,然后将新数据添加到3个问题字段(djlike,thinkclublike,plait)。但是,来自新州用户的歌曲的第一次评论将不得不创建一个新的记录。
再说一次,为了清楚起见,第一次来自“纽约”的用户评论(歌曲)“123”它将创建一个带有歌曲ID,州名称的新记录,并将评论值添加到3列stdjlike,stthinkclublike和stplait。下一个用户,一个不同的用户,来自纽约的歌曲“123”创建一个评论,它只会更新记录,将stdjlike,stthinkclublike和stplait的值添加到上一个评论。
我整个星期都在四处寻找并找到很多解决类似但不同问题的好方案(A well documented solution here)。我决定使用增量,因为我正在使用非固定数字的值进行更新,我一直在尝试,但我无法让它工作。
我从什么起作用开始。当它只是一个简单的.new和.save时,reviewstate控制器中的create会保存记录。所以我把它从那里改为了......
def create
@reviewstate = Reviewstate.find_or_initialize_by_songid_and_state(song.id, current_user.state)
@reviewstate.stdjlike.increment!(:stdjlike, reviewstate.stdjlike)
@reviewstate.stthinkclublike.increment!(:stthinkclublike, reviewstate.stthinkclublike)
@reviewstate.stplait.increment!(:stplait, reviewstate.stplait)
@reviewstate.save!
end
停止工作。我尝试了不同的变化和方法,这是我觉得最接近的时候。请帮帮我,已经4天了:)。
提前谢谢。
答案 0 :(得分:0)
如果find没有返回记录并且初始化了一个新记录,则stdjlike将为nil(除非您在迁移中设置了另一个默认值)。因此,增量将尝试增加Nil。 Nil虽然不是一个固定的,但它不会起作用。我想这是你得到的错误。
此外,您将对象存储在@reviewstate中,然后通过reviewstate.stdjlike引用它。你有一个实例变量@reviewstate,然后你引用局部变量reviewstate。它们是两个不同的对象。
你应该以不同的方式处理事情。检查您的记录是否存在。如果是的话,就去吧。如果没有,请创建它。使用Reviewstate.exists?。
另外,请记住Ruby使用下划线作为名称的约定。这会使它像std_jlike或类似的东西。但是你可以随时使用你感觉更舒服的东西。
答案 1 :(得分:0)
这听起来非常激烈,但从长远来看,我认为会让事情变得更简单。我要推荐一个非常大的重构器。听起来你有一些东西应该是他们自己的模型:
我会构建应用程序,以便您的评论属于一个州,一个用户和一首歌:
#user.rb
class User << ActiveRecord::Base
has_many :reviews
end
#state.rb
class State << ActiveRecord::Base
has_many :reviews
end
#song.rb
class Song << ActiveRecord::Base
has_many :reviews
end
#review.rb
class Review << ActiveRecord::Base
belongs_to :user
belongs_to :state
belongs_to :song
end
然后,当您想要收集某种形式的统计数据进行显示时,您可以从审阅记录中获取它。这样您就可以获得州,DJ或歌曲的统计数据。
这也是一个更RESTful的实现,其中系统中的更多对象表示为可以(C)reated,(R)ead,(U)pdated和(D)estroyed的资源。一般来说,以RESTful方式进行操作会使您在使用rails时更轻松。