Rails关系建模 - 快速q。 - “我这样做对吗?”

时间:2012-05-20 21:11:34

标签: ruby-on-rails rails-activerecord data-modeling modeling

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

当用户选择进行狩猎时,我称之为“旅行”。我已经阅读了关于员工的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. 有更智能(或更优雅)的方式吗?
  3. 更新:这是我最终做的事情。

        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
    

3 个答案:

答案 0 :(得分:1)

我看到一些小问题:

  1. 模型是惯用的单数形式:更改UsersHunts,除非您遇到异常情况。
  2. Hunt可能是has_many :trips,对吧?
  3. 您的迁移非常稀疏。 change方法通常如下所示:
  4. def change
      create_table :trips do |t|
        t.string :trip_name
        t.references :user
        t.references :hunt
      end
    end
    

    在结构上,你所拥有的东西对我来说很有意义。

    除此之外:我组织了adventures有时被称为寻宝者狩猎,我很高兴我不是唯一一个做这类事情的程序员!

答案 1 :(得分: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 

和旅行表看起来像:

# trip table , has 1 extra column: 
id 
hunt_id

答案 2 :(得分: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

即使您不需要双向关系,它也更容易理解(imho)并且它是为未来设置的,允许用户进行许多搜索和搜寻以获得许多用户,这看起来非常可行。