Rails 5与可重用模型有很多联系

时间:2017-11-20 23:20:07

标签: ruby-on-rails ruby-on-rails-5

我一直在研究这个问题,我认为我缺乏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 %>

1 个答案:

答案 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

到目前为止,您的模式非常幼稚,您可能希望回过头来阅读一些文章并思考您需要什么类型的对象以及它们之间的关联。只要它不是直接的一对一或一对多,您需要提供连接。