ruby on rails 3 - find_by_or_initialize_by*_and_* and increm



我在编程方面有点慢,但我喜欢它,并尽可能多地学习。因此,如果我的问题不够清楚,请提前道歉。

我有一个应用程序,其唯一目的是让dj评论歌曲,并将歌曲评论按州分组。5个字段…songid, state, stdjlike, stthinkclublike, stplait(我知道这些名字很可怕,但它们帮助我记住了它们是什么:))。

一旦用户决定评论一首歌曲,他们将被问及3个问题,这些问题的答案按1到5的等级进行回答,表格收集这3个答案以及用户状态和歌曲id。大多数情况下,数据库只查找状态和歌曲id,然后将新数据添加到3个问题字段(djlike、thinkclublike、plait)中。但是,用户在新状态下对歌曲的第一次评论必须创建一个新记录。

所以,再一次,只是为了澄清,第一次来自"纽约"的用户评论(歌曲)"123",它将创建一个包含歌曲id、州名的新记录,并将评论值添加到stdjlike、stthinkclublike和stplait三列中。下一个用户,一个不同的用户,从NY为歌曲"123"创建了一个评论,它将只是更新记录,将stdjlike, stthinkclublike和stplait的值添加到前一个评论。

我整个星期都在四处寻找,找到了许多类似但不相同的问题的好解决方案(这里有一个文档齐全的解决方案)。我决定去增量,因为我正在更新的值不是固定的数字,我一直在尝试,但我只是不能让它工作。

我从有用的开始。reviewstate控制器中的create保存记录,当它只是一个简单的。new和。save。所以我把它从那里改成了这个…

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天了。

提前感谢。

如果find没有返回记录,并且初始化了一个新记录,则stdjlike将为nil(除非您在迁移中设置了另一个默认值)。因此,increment将尝试递增Nil。Nil不是一个固定值,但它不会工作。我想这就是你得到的错误。

此外,您将对象存储在@reviewstate中,然后通过reviewstate.stdjlike引用它。您有一个实例变量@reviewstate,然后引用本地变量reviewstate。它们是两个不同的对象。

你应该用不同的方式处理事情。检查您的记录是否存在。如果有,那就去取吧。如果没有,那就创建它。使用Reviewstate.exists ?。

另外,请记住Ruby使用下划线作为名称的约定。这会让它变成std_jlike之类的东西。但是你可以选择你觉得更舒服的。

这听起来很激烈,但我认为从长远来看会让事情变得更简单。我要推荐一个相当大的重构。听起来你有一些东西应该是他们自己的模型:

  • 用户(或DJ)
  • 歌曲
  • 评论

我将构建应用程序,以便您的评论属于一个州,一个用户和一首歌曲:

#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)创建、(R)读取、(U)更新和(D)销毁的资源。一般来说,以RESTful方式做事会使您在rails中工作时更轻松。

相关内容

  • 没有找到相关文章

最新更新