如何关联这三个模型以获得适当的输出?

时间:2012-08-12 02:42:51

标签: ruby-on-rails ruby associations sinatra ruby-datamapper

我刚开始使用Ruby。我在Sinatra做了一个小应用程序,我正在使用带有sqlite3 db的Datamapper。

以下是我正在制作的三种型号。

class Team
  include DataMapper::Resource
  property :id, Serial
  property :name, String, :required => true
  property :created_at, DateTime
  property :updated_at, DateTime
end

class Poll
  include DataMapper::Resource
  property :id, Serial
  property :name, String, :required => true
  property :created_at, DateTime
  property :updated_at, DateTime
end

class Ranking
  include DataMapper::Resource
  property :year, Integer
  property :week, Integer
  property :ranking, Integer
  property :votes, Integer
  property :created_at, DateTime
  property :updated_at, DateTime

  belongs_to :team, :key => true
  belongs_to :poll, :key => true
end

我希望能够查询某个民意调查,周和年的排名模型。

返回的结果应该是该轮询的所有排名,以及相关团队的每个排名数。

所以获得2011年 - 第1周或第1周 - 第7周等每个排名的排名和相应团队......

我一整天都在努力弄清楚如何让它发挥作用,而我无处可去,所以这就是我现在在这里寻求帮助的原因。

1 个答案:

答案 0 :(得分:0)

首先让我说我从未听说过Datamapper的宝石。我可以更容易地继续思考Rails模型和迁移,所以我希望你不要介意我这样做。

我对数据模型有一些评论:

  • 除非我误解了你的模型,否则我认为所有与日期相关的字段都应该在民意调查表而不是排名表中。排名表中的字段应描述团队和民意调查之间的关系。
  • 您应该在投票日期使用单个字段,然后在控制器中使用类似commercial方法的内容来检索特定周内的民意调查。 (来源:http://apidock.com/ruby/Date/commercial/class
  • 如果您愿意,您还可以存储与民意调查相关的其他数据,例如总票数。那些也会进入民意调查表。

模型

应用程序/模型/ team.rb

class Team < ActiveRecord::Base
    has_many :rankings
    has_many :polls, through: :rankings
    validates :name, :presence => true
end

应用程序/模型/ poll.rb

class Poll < ActiveRecord::Base
    has_many :rankings
    has_many :teams, through: :rankings
    validates :name, :presence => true
end

应用程序/模型/ ranking.rb

class Ranking < ActiveRecord::Base
    belongs_to :team
    belongs_to :poll
end

迁移

分贝/迁移/ create_teams.rb

class CreateTeams < ActiveRecord::Migration
    def change
        create_table :teams do |t|
            t.string :name
            t.timestamps
        end
    end
end

分贝/迁移/ create_polls.rb

class CreatePolls < ActiveRecord::Migration
    def change
        create_table :polls do |t|
            t.string :name
            t.date :published_at
            t.timestamps
        end
    end
end

分贝/迁移/ create_rankings.rb

class CreateRankings < ActiveRecord::Migration
    def change
        create_table :rankings do |t|
            t.integer :team_id
            t.integer :poll_id
            t.integer :votes
            t.integer :ranking
            t.timestamps
        end
    end
end

如果您没有时间设置测试应用程序来检查关系,请告诉我。