我可以别名'一个Rails活动模型到另一个类?

时间:2016-05-09 18:03:25

标签: ruby-on-rails activerecord

首先我确定我没有正确地提出这个问题,因为这是我现在头脑中的高级Rails主题。以下是我对路线的看法:

concern :assetable do
  resources :assets, concerns: [:workable, :trackable, :flagged, :historical, :commentable, :uploadable], shallow: true do
    resources :assets, path: :components, as: :components, shallow: true#, only: [:index, :create, :new]
  end
end  

和我的资产模型:

has_many :assets, :as => :assetable, :dependent => :destroy
alias_attribute :components, :assets

我的前提是我有一个Asset模型,它可以多态地属于我的Rails应用程序中的任何其他模型 - 包括另一个Asset。我的情况是我将这个案例限制在一个深度并且调用这些Components。这就像将汽车作为资产并且它具有发动机,变速器等作为组件。出于我的目的,它很简单,可以创建一组在资产和组件之间共享的公共属性,

现在我可以创建一个完整的新模型,但是整个数据结构,视图控制器等大部分都是相同的,所以我认为这只是浪费时间并且使得这些代码保持同步变得一团糟。

在我现在进行的过程中,我不得不在我的观点中添加一些逻辑来确保标题,即“资产”和“资产”。与"组件"我在我的控制器@asset_class中有一个简单的实例变量,它返回' asset'或者'组件'。现在丑陋的部分是我开始使用路线。所有令人敬畏的Rails url助手等都让我失败了,因为如果我在组件记录上调用url_for( ),那么当我真正想要/assets/etc/etc时,我会得到/components/etc/etc/。我基本上希望嵌套在Assets下的Assets表示为Component class而不是Asset。

我可以这样做吗?我认为这是更简单的方法,但我对其他建议(以及问题编辑)持开放态度,因为我可能会偏离逻辑和设计。

**更新**

以下是第一条评论的更多背景资料:

所以在我的Asset节目控制器中,我故意添加了一个例外来说明这一点。这是我的网址:

  

http://localhost:3000/components/5

从我的错误控制台我有:

>> @asset
=> #<Asset id: 5, assetable_id: 1, assetable_type: "Asset", name: "...>
>> url_for(@asset)
=> "http://localhost:3000/assets/5"
>> component_path(@asset)
=> "/components/5"
>> asset_path(@asset)
=> "/assets/5"

我知道我可以使用component_path(@asset)但是url_for如果我可以让Rails完成所有工作而不是每次我想添加{{1时不断添加一些条件逻辑我还看到我需要根据link_to向我的路线添加一些条件,因为assessable_type不应该出现在Assets中,反之亦然。

2 个答案:

答案 0 :(得分:1)

您可以考虑创建一个继承自Asset的Component类,以便您可以将所有这些存储在assets表中,但不同地对待它们。这通常称为单表继承。

http://api.rubyonrails.org/classes/ActiveRecord/Inheritance.html

答案 1 :(得分:0)

您可以像这样定义组件路由:

resources :components, controller: 'assets', path: :components, as: :components, shallow: true#, only: [:index, :create, :new], defaults: { components: true }

这使用Specifying a Controller to UseRails Routing from the Outside In部分中描述的技术。它还使用同一指南的Defining Defaults部分中的defaults选项通知控制器它正在使用组件路由,而不是资产路由。