1

我正在开发一个寻宝游戏应用程序,我只想知道我是否正确建模。有一个用户可以继续进行的狩猎列表。这些搜寻是可以自定义的模板(例如添加/删除某些任务)。

当用户选择去打猎时,我称之为“旅行”。我已经阅读了关于 Associates 的 Rails 指南,我认为我应该将旅行模型设置为用户和狩猎之间的连接表。这就是我的想法。

    class Users 
      has_many :trips
      has_many :hunts, :through => :trips

    class Hunts
      has_one :trip
      has_many :users, :through => : trips

    class Trip
      belongs_to :users
      belongs_to :hunts

然后我设置 Trip 表的迁移将如下所示。

    def change
      trip_name
      user_id
      hunt_id
    end

我有两个问题。

  1. 这看起来对吗?
  2. 有没有更聪明(或更优雅)的方法来做到这一点?

更新:这就是我最终做的事情。

    class Users 
      has_many :trips
      has_many :hunts, :through => trips

    class Hunts
      has_one :trip
      has_many :users, :through => trips

    class Trip
      belongs_to :hunts
      belongs_to :users

进而

    def change
      create_table :trips do |t|
        t.string :trip_name
        t.references :user
        t.references :hunt
      end
      add_index :trips, :hunt_id
      add_index :trips, :user_id
      add_index :trips, [:hunt_id, :user_id], :unique => true
    end
4

3 回答 3

1

我看到一些小问题:

  1. 模型习惯上是单一的:改变UsersHunts除非你有一个不寻常的情况。
  2. Hunt大概是吧has_many :trips
  3. 您的迁移非常稀少。该change方法通常看起来像这样:

.

def change
  create_table :trips do |t|
    t.string :trip_name
    t.references :user
    t.references :hunt
  end
end

从结构上讲,你所拥有的对我来说是有意义的。

旁白:我组织了有时被称为寻宝游戏的冒险活动,我很高兴我不是唯一一个做这些事情的程序员!

于 2012-05-20T21:29:26.223 回答
1

您正在使关联变得复杂。因为 Hunts : Trip = 1 : 1,你不需要它们都与用户相关联,例如

class Users 
  has_many :hunts
  has_many :trips, :through => hunts

class Hunts
  has_one :trip
  has_many :users

class Trip
  belongs_to :hunt  # belongs to singular word. :)

然后,创建一个表“users_hunts”,如下所示:

# users_hunts table, has 3 columns:
id
user_id
hunt_id 

和trips表看起来像:

# trip table , has 1 extra column: 
id 
hunt_id
于 2012-05-20T21:34:52.993 回答
1

我会去

class Users 
  has_many :trips
  has_many :hunts, :through => trips

class Hunts
  has_one :trip
  has_many :users, :through => trips

class Trip
  belongs_to :hunts
  belongs_to :users

即使您还不需要这两种方式的关系,它也更容易理解(恕我直言)并且它是为未来而设置的,允许用户进行多次狩猎和狩猎以获得许多用户,这似乎非常可行。

于 2012-05-20T21:40:27.170 回答