使用表名为rails表列上的ruby添加前缀以防止出现歧义字段

时间:2016-01-30 23:01:50

标签: ruby-on-rails ruby

我创建了一些rails应用程序,有些是生产,有些只是为了好玩。现在我想创建一个有点复杂的应用程序,并且会大量使用连接。

模型中rails的当前方法是自动生成model.id,model.created_at和model.updated_at属性。

这很好,但为了避免加入地狱,那些以模型名称为前缀的字段会不会更好?像这样:

Company:
 - com_id
 - com_name
 - com_created_at
 - com_updated_at

Order:
 - ord_id
 - ord_com_id
 - ord_price_group
 - ord_created_at
 - ord_updated_at

Product:
 - pro_id
 - pro_code
 - pro_name
 - pro_price_def_cents
 - pro_price_pre_cents
 - pro_price_res_cents

OrderItem:
 - ori_id
 - ori_ord_id
 - ori_pro_id
 - ori_code
 - ori_name
 - ori_price_cents
 - ori_created_at
 - ori_updated_at

通过这种方式,您可以加入所有模型而无需命名问题:

OrderItem:
ori.ori_id: 19785,
ori.ord_id: 87450,
  ori.ord.com_id: 145,
    ori.ord.com.com_name: "Acme",
    ori.ord.com.com_created_at: 1970-01-01 00:00:00,
    ori.ord.com.com_updated_at: 1970-01-01 00:00:00,
  ori.ord.ord_price_group: "res",
  ori.ord.ord_created_at: 2015-12-31 14:56:01,
  ori.ord.ord_updated_at: 2016-01-31 01:00:00,
ori.ori_pro_id: 1780,
  ori.pro.pro_code: "pap-pla-80",
  ori.pro.pro_name: "Paper, plain, 80g",
  ori.pro.pro_price_def_cents: 16999,
  ori.pro.pro_price_pre_cents: 15999,
  ori.pro.pro_price_res_cents: 14999,
  ori.pro.pro_created_at: 1970-01-01 00:00:00,
  ori.pro.pro_updated_at: 1970-01-01 00:00:00,
ori.ori_code: nil,
ori.ori_name: nil,
ori.ori_price_cents: 14999,
ori.ori_updated_at: 2016-01-30 04:00:00,
ori.ori_updated_at: 2016-01-30 15:00:00

这样你就可以使用所有属性“flattened”,并且永远不必担心属性,以防你只需要切换方向(你看一下那个特定的OrderItem,或者你想要订单包括OrderItems和Company,或者只是想要了解特定公司的所有订单和OrderItem。无论您加入什么方式,属性都保持不变,因此您可以使用完全相同的部分/ order_item,/ order - > items,/ product - > orders - &gt ; items,/ company - > orders - > items - > products etc.。

问题是:这是一个好方法吗?它在Rails中可行吗?当我们跟踪我们自己的客户订单时,如何解决问题,但是跟踪客户(公司)与其客户(公司)之间的订单? rails可以动态地为属性添加前缀以防止歧义吗?或者你只需​​要为每种可能的场景写一个单独的视图吗?

1 个答案:

答案 0 :(得分:0)

最好不要单独留下列名。在大多数情况下,您使用ActiveRecord,例如:

Company.join(:产物).includes(:订单)

(Totes组成,可能不起作用。至少它需要在模型上适当的has_many / belongs_to等)

当你访问各种属性时,事情就会起作用。你不需要做前缀,你也不会加入地狱,因为ActiveRecord会为你照顾它。如果你看一下生成的查询,就会加入地狱,但这就是ActiveRecord的问题。

tl; dr:没有前缀,如果让Rails处理它,Rails会正确处理它。