2015-09-16 207 views
0

我正在一家網上時尚商店。我有一個分類模型和一個尺寸模型。模型可以有多種尺寸。大小可以有很多種類。has_many通過協會

因此,我通過關聯使用has_many。類別模型和尺寸模型將通過名爲category_sizes的錶鏈接起來。

我會創建一堆像XS,Small,Medium這樣的尺寸。然後我會創建一個類別讓我們說襯衫,然後我可以選擇一個襯衫將有的所有尺寸。然後點擊創建。

我如何讓尺寸顯示在我的視圖中?我試了幾個小時。

類別型號

class Category < ActiveRecord::Base 
    has_ancestry 
    has_many :items 
    validates :name, presence: true, length: { maximum: 20 } 
    has_many :category_sizes 
    has_many :sizes, through: :category_sizes 
end 

規格型號

class Size < ActiveRecord::Base 
    validates :title, presence: true, length: { maximum: 15 } 
    validates :title, uniqueness: true 
    has_many :category_sizes 
    has_many :categories, through: :category_sizes 
end 

category_size模型

class CategorySize < ActiveRecord::Base 
    belongs_to :category 
    belongs_to :sizes 
end 

這裏是我的形式。

<div class="container"> 
    <div class=「row」> 
    <div class="col-md-6 col-md-offset-3"> 
     <div class="panel panel-primary"> 
     <div class="panel-body"> 
      <%= simple_form_for(@category) do |f| %> 
       <div class="form-inputs"> 
       <%= f.input :name %> 
       <%= f.association :category_sizes %> 
       <%= f.collection_select :parent_id, Category.order(:name), :id, :name, {prompt: "Select Parrent ID If Applicable"},include_blank: true %> 
       <div class="form-actions"><%= f.button :submit %></div> 
      </div> 
      <% end %> 
     </div> 
     </div> 
    </div> 
    </div> 
</div> 

架構

ActiveRecord::Schema.define(version: 20150915113019) do 

    create_table "categories", force: :cascade do |t| 
    t.string "name" 
    t.string "ancestry" 
    t.datetime "created_at", null: false 
    t.datetime "updated_at", null: false 
    end 

    add_index "categories", ["ancestry"], name: "index_categories_on_ancestry" 

    create_table "category_sizes", force: :cascade do |t| 
    t.integer "category_id" 
    t.integer "size_id" 
    t.datetime "created_at", null: false 
    t.datetime "updated_at", null: false 
    end 

    add_index "category_sizes", ["category_id"], name: "index_category_sizes_on_category_id" 
    add_index "category_sizes", ["size_id"], name: "index_category_sizes_on_size_id" 

    create_table "items", force: :cascade do |t| 
    t.string "title" 
    t.decimal "price" 
    t.text  "description" 
    t.datetime "created_at",   null: false 
    t.datetime "updated_at",   null: false 
    t.integer "user_id" 
    t.string "image_file_name" 
    t.string "image_content_type" 
    t.integer "image_file_size" 
    t.datetime "image_updated_at" 
    t.integer "category_id" 
    end 

    add_index "items", ["user_id", "created_at"], name: "index_items_on_user_id_and_created_at" 
    add_index "items", ["user_id"], name: "index_items_on_user_id" 

    create_table "sizes", force: :cascade do |t| 
    t.text  "title" 
    t.datetime "created_at", null: false 
    t.datetime "updated_at", null: false 
    end 

    create_table "taggings", force: :cascade do |t| 
    t.integer "tag_id" 
    t.integer "taggable_id" 
    t.string "taggable_type" 
    t.integer "tagger_id" 
    t.string "tagger_type" 
    t.string "context",  limit: 128 
    t.datetime "created_at" 
    end 

    add_index "taggings", ["tag_id", "taggable_id", "taggable_type", "context", "tagger_id", "tagger_type"], name: "taggings_idx", unique: true 
    add_index "taggings", ["taggable_id", "taggable_type", "context"], name: "index_taggings_on_taggable_id_and_taggable_type_and_context" 

    create_table "tags", force: :cascade do |t| 
    t.string "name" 
    t.integer "taggings_count", default: 0 
    end 

    add_index "tags", ["name"], name: "index_tags_on_name", unique: true 

    create_table "users", force: :cascade do |t| 
    t.string "username" 
    t.string "email" 
    t.datetime "created_at",       null: false 
    t.datetime "updated_at",       null: false 
    t.string "password_digest" 
    t.string "remember_digest" 
    t.boolean "admin",    default: false 
    t.string "activation_digest" 
    t.boolean "activated",   default: false 
    t.datetime "activated_at" 
    t.string "reset_digest" 
    t.string ">" 
    t.datetime "reset_sent_at" 
    t.string "avatar_file_name" 
    t.string "avatar_content_type" 
    t.integer "avatar_file_size" 
    t.datetime "avatar_updated_at" 
    t.text  "description" 
    end 

    add_index "users", ["email"], name: "index_users_on_email", unique: true 

end 

回答

0

您是否嘗試過這樣的事情?

<%= f.select(:size_id, Size.all.map {|s| [s.title, s.id]}) %> 
+0

這個工作<%= f.select(:category_sizes,Size.all.map {| S | [s.title,s.id]})%>。但是,你知道如何改變它,所以我可以選擇多種尺寸?我目前只能選擇1個? – joeyk16

+0

你會需要一個check_box_tag我想。這可能會幫助你:http://stackoverflow.com/questions/17939931/rails-how-can-i-pass-multiple-values-through-check-box-tag – soltex

0

在你的控制器限定,

@size_variant_array = @category.sizes 

在視圖,

<%= select_tag 'size',options_for_select(@size_variant_array.collect{ |pv| [pv.title, pv.id] }) ,:prompt => "Please Select"%>