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
。
我的问题是,访问视图中每个 @order
的 ort_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_name
和 ord_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
我有两个模型:
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
。
我的问题是,访问视图中每个 @order
的 ort_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_name
和 ord_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