Rails - 单向表关联 - 访问数据问题

时间:2015-09-07 13:34:09

标签: ruby-on-rails model-associations

我有两种模式:

class Order < ActiveRecord::Base
  belongs_to :user
  has_one :order_type
end

class OrderType < ActiveRecord::Base
  belongs_to :order
end

我的 schema.rb

create_table "order_types", force: :cascade do |t|
  t.string   "ort_name"
  t.datetime "created_at", null: false
  t.datetime "updated_at", null: false
end

create_table "orders", force: :cascade do |t|
  t.string   "ord_name"
  t.date     "ord_due_date"
  t.integer  "user_id"
  t.integer  "ordertype_id"
  t.datetime "created_at",   null: false
  t.datetime "updated_at",   null: false
end

add_index "orders", ["ordertype_id"], name: "index_orders_on_ordertype_id"
add_index "orders", ["user_id"], name: "index_orders_on_user_id"

它们之间只有单向关联。 Order模型的列“ordertype_id”链接到相应的order_type

我的问题是,在视图中访问每个ort_name的{​​{1}}值的最佳做法是什么。

目前,我正在使用:

@order

此解决方案会导致许多代码重复。我该如何改变呢?有人可以建议,因为我不是那么有经验吗?

我尝试了这段代码,但它不起作用:

<p> 
  <strong>Ord type:</strong>
  <% OrderType.where(id:  @order.ordertype_id).each do |t| %>
  <%= t.ort_name %>
  <% end %>
</p>

2 个答案:

答案 0 :(得分:1)

您应该解决许多问题。成为初学者是好的,只要花时间学习和提高。

模式

首先,您的架构设置得很糟糕。如果要将order type限制为特定值,则应通过验证执行此操作。

class Order
  TYPES = %w[foo bar three four five]

  validates :order_type, inclusion: { in: TYPES }
end

这样,您可以在将来轻松添加值,并消除添加新模型及其关系的复杂性。

列名

其次,您应该修改列名。 ord_nameord_due_date很糟糕,会导致像order.ord_name这样丑陋的调用。你应该删除前缀ord,这是多余的。

这两个步骤都会导致 schema.rb

create_table "orders", force: :cascade do |t|
  t.string   "name"
  t.date     "due_date"
  t.integer  "user_id"
  t.string   "order_type"
  t.datetime "created_at",   null: false
  t.datetime "updated_at",   null: false
end

逻辑布局

我的最后建议是永远不要从您的视图中调用查询。逻辑应始终位于控制器/模型和控制器中。通过实例变量传递给视图。

这在轨道中是一个很大的禁忌:

<% OrderType.where(id:  @order.ordertype_id).each do |t| %>
  ...
<% end %>

最后,只需通过以下方式完成访问:

@order.order_type

答案 1 :(得分:-1)

将您的Order模型更新为:

class Order < ActiveRecord::Base
  belongs_to :user
  has_one :order_type, foreign_key: 'ordertype_id`
end

然后order_type应该很容易访问:

@order.order_type.ort_name