Model/Association 为新 Rails 应用程序设计
Model/Association Design For New Rails Application
我即将开始在 Rails 中构建一个应用程序(刚开始学习 Rails,所以认为这将是一个很好的基础练习)并希望就如何构建我的模型和关联。该应用程序旨在主持一个 "game",用户可以在其中猜测他们认为在给定的音乐会上将播放什么歌曲,每场演出都是乐队演奏的。到目前为止,我有以下模型(具有近似属性):
User
:跟踪活跃用户(user_name
、user_password
、user_email
等)
Submission
:跟踪给定用户对给定节目的猜测(date_of_show
、guess_1
、guess_2
、guess_3
、user_id
)
Show
:跟踪乐队演奏的每个节目 (date_of_show
, songs_played
)
Song
: 跟踪乐队的当前目录 (song_name
)
User
和 Submission
之间的关系非常简单:
class User < ActiveRecord::Base
has_many :submissions
end
class Submission < ActiveRecord::Base
belongs_to :user
end
但是说到其他部分之间的关系,事情变得有点不清楚,所以我有以下问题:
- 每个
Submission
对应一个Show
。说每个 Submission
belongs_to
一个 Show
和每个 Show
has_many
Submissions
使用 date_of_show
作为键是否有意义?
- 有必要
Song
模型吗?在应用程序的初始版本中,它将简单地用作验证猜测的列表(即填充 select
下拉列表)。
- 如果我应该保留
Song
模型,我如何将其与其他模型相关联? User
没有歌曲,所以很简单,但是每个 Submission
有三首 Songs
,每个 Show
可以有不同数量的 Songs
.
- 关于每个
Show
具有不同数量的 Songs
的观点,是将它们存储在数组中的最佳方法,ala this post (http://amberonrails.com/storing-arrays-in-a-database-field-w-rails-activerecord/) 还是有更好的方法?最终,我将需要实现一些循环遍历每个 Submission
的方法,检查 guess_1
、guess_2
和 guess_3
针对 songs_played
数组(或任何其他我在 Show
模型中使用的替代方案,并生成一个分数。
第一步,像现实生活一样设计您的应用程序。当你有更多的经验时,你可以放弃一些模型,模拟其他的进行一些优化。
在现实生活中,如何设计节目?这是一个乐队在演奏歌曲。如何设计乐队?这是一群人(这里没有使用)有歌曲。如何设计提交?这是用户认为一次播放一首歌。
那么,你可以拥有这些模型:
User (name...)
Song (name, band_id) : belongs_to a band and have many show_songs
Band (name) : has_many songs and has_many shows
Show (band_id) : belongs_to band
ShowSong (show_id, song_id, datetime) : belongs_to show and song
Submission (user_id, song_id, show_song_id) : belongs_to song and show_song
不是唯一的解决方案,你可以设计你想要的。
我根据一些 Rails 实践设计了这些模型:
- 不要使用 date_of_show 作为键,使用 _id(这就是我插入 show_song 的原因)
- 当模型有特定方法或必须在数据库中注册时,必须有一个模型
- 不要使用 guess_1、guess_2、...使用 have_many 猜测
我即将开始在 Rails 中构建一个应用程序(刚开始学习 Rails,所以认为这将是一个很好的基础练习)并希望就如何构建我的模型和关联。该应用程序旨在主持一个 "game",用户可以在其中猜测他们认为在给定的音乐会上将播放什么歌曲,每场演出都是乐队演奏的。到目前为止,我有以下模型(具有近似属性):
User
:跟踪活跃用户(user_name
、user_password
、user_email
等)Submission
:跟踪给定用户对给定节目的猜测(date_of_show
、guess_1
、guess_2
、guess_3
、user_id
)Show
:跟踪乐队演奏的每个节目 (date_of_show
,songs_played
)Song
: 跟踪乐队的当前目录 (song_name
)
User
和 Submission
之间的关系非常简单:
class User < ActiveRecord::Base
has_many :submissions
end
class Submission < ActiveRecord::Base
belongs_to :user
end
但是说到其他部分之间的关系,事情变得有点不清楚,所以我有以下问题:
- 每个
Submission
对应一个Show
。说每个Submission
belongs_to
一个Show
和每个Show
has_many
Submissions
使用date_of_show
作为键是否有意义? - 有必要
Song
模型吗?在应用程序的初始版本中,它将简单地用作验证猜测的列表(即填充select
下拉列表)。 - 如果我应该保留
Song
模型,我如何将其与其他模型相关联?User
没有歌曲,所以很简单,但是每个Submission
有三首Songs
,每个Show
可以有不同数量的Songs
. - 关于每个
Show
具有不同数量的Songs
的观点,是将它们存储在数组中的最佳方法,ala this post (http://amberonrails.com/storing-arrays-in-a-database-field-w-rails-activerecord/) 还是有更好的方法?最终,我将需要实现一些循环遍历每个Submission
的方法,检查guess_1
、guess_2
和guess_3
针对songs_played
数组(或任何其他我在Show
模型中使用的替代方案,并生成一个分数。
第一步,像现实生活一样设计您的应用程序。当你有更多的经验时,你可以放弃一些模型,模拟其他的进行一些优化。
在现实生活中,如何设计节目?这是一个乐队在演奏歌曲。如何设计乐队?这是一群人(这里没有使用)有歌曲。如何设计提交?这是用户认为一次播放一首歌。
那么,你可以拥有这些模型:
User (name...)
Song (name, band_id) : belongs_to a band and have many show_songs
Band (name) : has_many songs and has_many shows
Show (band_id) : belongs_to band
ShowSong (show_id, song_id, datetime) : belongs_to show and song
Submission (user_id, song_id, show_song_id) : belongs_to song and show_song
不是唯一的解决方案,你可以设计你想要的。
我根据一些 Rails 实践设计了这些模型:
- 不要使用 date_of_show 作为键,使用 _id(这就是我插入 show_song 的原因)
- 当模型有特定方法或必须在数据库中注册时,必须有一个模型
- 不要使用 guess_1、guess_2、...使用 have_many 猜测