0

我有点困惑并寻求一些建议

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

Company
has_many :transactions

Transaction
belongs_to :company

但现在我需要包含类别,以便更好地组织和管理用户事务。我希望用户自己创建类别,然后将新事务添加到他直接创建的类别中。有点像 Transaction now belongs_to 一个类别。话虽如此,我不想打破我目前的模式,因为它也可以按我的意愿工作,而且感觉很好(公司进行交易)。

我的路线已经足够嵌套,所以再做一层会使我的情况更加丑陋。这个

  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,还是应该重组?在我的情况下,最佳路由是什么?谢谢你。

4

3 回答 3

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

当然,您可以在 Transaction 模型中保留您的 company_id 属性并保留belongs_to :company调用。这为您提供了每笔交易与进行交易的公司之间直接联系的好处。但它给你带来了额外的责任来正确地维持关系。最终,取决于您的业务需求,采用哪种方法取决于您。

当涉及到资源和路线时,你不应该嵌套太深——尤其是对于任何给定的交易,只有一个类别和一个公司。就个人而言,我可能会选择以下嵌套(省略任何浅层选项):

resources :companies do
  resources :categories
  resources :transactions
end

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

于 2013-11-06T11:37:11.927 回答
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]

请注意,我尚未对此进行测试,如果您对此有任何疑问,请告诉我,我将启动一个沙箱并确保其正常工作。

于 2013-11-06T11:38:00.383 回答
0
Company
has_many :transactions

Category
has_many :transactions

Transaction
belongs_to :category
belongs_to :company

Add resources :categories out side.
于 2013-11-06T11:27:55.160 回答