Rails - 这里模型之间的正确关系是什么?

时间:2013-11-06 11:09:50

标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-4

我有点困惑并且正在寻找一些建议

我有一个用户应用,每个用户都有一个公司,每个公司都有交易

Company
has_many :transactions

Transaction
belongs_to :company

但现在我需要包含类别以更好地组织和管理用户事务。我希望用户自己创建Categories,然后在他直接创建的类别中添加新的Transactions。有点像交易现在属于一个类别。话虽如此,我觉得我不想破坏我现在的模型,因为它的工作方式也是我想要的,只是感觉正确(公司执行交易)。

我的路线已经足够嵌套了,所以制作另一个图层会让我的情况更加清晰。此

  resources :users do
    resources :companies, shallow: true do
      resources :transactions, shallow: true
    end
  end

  resources :users do
    resources :companies, shallow: true do
      resources :categories, shallow: true do      
        resources :transactions, shallow: true
    end
  end
end

这里有什么建议吗?也许有人有类似的困境?我应该在Transaction模型上建立多个belongs_to,还是应该重组?在我的情况下,最佳路由是什么?谢谢。

3 个答案:

答案 0 :(得分:1)

你不应该混淆你的域建模 - 在这种情况下,添加Category模型 - 从构造你的路线文件。对于您域中的每个模型,都不一定要有控制器。

在这种情况下,听起来您想要将模型调整为:

def Company < ActiveRecord::Base
  has_many :categories
  has_many :transactions, through: :categories
end

def Category < ActiveRecord::Base
  belongs_to :company
  has_many :transactions
end

def Transaction < ActiveRecord::Base
  belongs_to :category
end

您从上述模型中获得的“开箱即用”是从交易到公司的直接关联 - belongs_to没有:through选项。但是,在事务上调用.category.company将使您获得正确的模型,并且如果需要,您可以将其包装到Transaction中的实例方法中。

当然,您可以在交易模型中保留您的company_id属性并保留belongs_to :company来电。这为您提供了每笔交易与成交公司之间直接联系的优势。但它会给你额外的责任,以正确维护关系。最终,取决于您的业务需求,由您决定采用哪种方法。

当谈到资源和路线时,你不需要过深地嵌套 - 特别是对于任何给定的交易,只有一个类别和一个公司。就个人而言,我可能会选择以下嵌套(省略任何浅层选项):

resources :companies do
  resources :categories
  resources :transactions
end

最终,再次专注于向用户提供简单的表单,而这往往指向直接的路由方法。

答案 1 :(得分:1)

由于我不知道您的实施细节,我无法提供最好的建议,但我能做的就是告诉您如何基于我对您的关系的理解来构建这些关系。重新尝试建模:

Company
has_many :categories
has_many :transactions, through: :categories

Category
belongs_to :company
has_many :transactions

Transaction
belongs_to :category

您可以通过多种方式进行布线。此外,如果用户只能访问他们拥有的公司,那么您不需要将/ user作为路径的一部分包含在内,而是可以单独在控制器中获取user_id。

/[user]/[company]/[category]/[transaction]
/[user]/[company]/[transaction]

请注意,我没有对此进行过测试,如果您遇到问题请告诉我,我会启动一个沙盒并确保它有效。

答案 2 :(得分:0)

Company
has_many :transactions

Category
has_many :transactions

Transaction
belongs_to :category
belongs_to :company

Add resources :categories out side.