我一直在研究这个问题,我认为我缺乏Rails数据库设计是我的最佳选择。
我正在为一家客户建立一个网站,为南加州的四(4)个地点提供派对服务。
为此,我有三(3)个模型 - Locations, Categories, Products
。
例如:
http://somewebsite.com/san-diego/birthday-parties/boy-themed
http://somewebsite.com/orange-county/birthday-parties/boy-themed
http://somewebsite.com/los-angeles/birthday-parties/boy-themed
http://somewebsite.com/riverside/birthday-parties/boy-themed
唯一的唯一模型是产品型号,因为每个位置的价格和描述都不同。 Location模型有很多类别,Category模型有很多产品。我有一切工作,除非我创建一个新的类别,我不能选择多个位置,我必须重新创建相同的类别名称4次;每个地点一个。
这是我的代码。
模式
create_table "locations", force: :cascade do |t|
t.string "name"
t.string "slug"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end
create_table "categories", force: :cascade do |t|
t.bigint "location_id"
t.string "name"
t.string "slug"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.index ["location_id"], name: "index_categories_on_location_id"
end
create_table "products", force: :cascade do |t|
t.bigint "category_id"
t.string "name"
t.string "slug"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.index ["category_id"], name: "index_products_on_category_id"
end
模型
class Location < ApplicationRecord
has_many :categories
...
class Category < ApplicationRecord
has_many :locations
has_many :products
...
class Product < ApplicationRecord
belongs_to :category
...
类别控制器
<%= form_for([@location, @category]) do |form| %>
<div class="form-group">
<%= form.label :name %>
<%= form.text_field :name, id: :category_name, class: 'input-md input-square form-control' %>
</div>
<div class="form-group">
<%= form.label :location_id, 'Parent Location' %>
<%= form.select :location_id, Location.order(:name).collect { |p| [p.name, p.id] }, { multiple: true, include_blank: true } %>
</div>
<div class="form-group">
<%= submit_tag 'Submit', class: 'button button-pasific' %>
</div>
<% end %>
答案 0 :(得分:1)
您想要的是一系列连接表来代替创建多对多关联:
class Category < ApplicationRecord
has_many :location_categories
has_many :locations, through: :location_categories
end
class Location < ApplicationRecord
has_many :location_categories
has_many :locations, through: :location_categories
end
class LocationCategory < ApplicationRecord
belongs_to :location
belongs_to :category
end
这允许任何类别具有多个位置,反之亦然。
另一种定义此方法以避免重复的方法是通过产品间接获取类别:
class Product < ApplicationRecord
has_many :product_categories
has_many :categories, through: :product_categories
end
class Category < ApplicationRecord
has_many :product_categories
has_many :products, through: :product_categories
end
class ProductCategory < ApplicationRecord
belongs_to :product
belongs_to :category
end
class Location < ApplicationRecord
has_many :products
has_many :categories, through: :products
end
到目前为止,您的模式非常幼稚,您可能希望回过头来阅读一些文章并思考您需要什么类型的对象以及它们之间的关联。只要它不是直接的一对一或一对多,您需要提供连接。