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

Rails - One-direction table association - accessing data issue

我有两个模型:

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

我的问题是,访问视图中每个 @orderort_name 值的最佳做法是什么。

目前,我正在使用:

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

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

我试过这段代码,但没有用:

@orders.order_type

将您的 Order 模型更新为:

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

那么 order_type 应该很容易访问:

@order.order_type.ort_name

有很多问题需要您解决。初学者没关系,慢慢来学习提高就好了。

架构

首先,您的架构设置不当。如果您想将 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

逻辑布局

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

这是rails中的一个大禁忌:

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

最后,访问类型很简单:

@order.order_type