我有两种模式:
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>
答案 0 :(得分:1)
您应该解决许多问题。成为初学者是好的,只要花时间学习和提高。
首先,您的架构设置得很糟糕。如果要将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
我的最后建议是永远不要从您的视图中调用查询。逻辑应始终位于控制器/模型和控制器中。通过实例变量传递给视图。
这在轨道中是一个很大的禁忌:
<% 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