2015-11-02 54 views
2

我有產品型號和Outfit型號。我想在我的Outfit展示視圖中僅顯示已批准的產品。它目前顯示所有產品。產品和服裝加入了一個名爲outfit_products的中間表。 outfit_products表具有默認爲false的布爾批准列。看一看。如何僅顯示已批准的產品 - 當前顯示所有產品

如何在我的視圖中顯示僅批准的產品?

Outfit.rb

class Outfit < ActiveRecord::Base 
    belongs_to :user 
    has_many :outfit_products 
    has_many :products, through: :outfit_products 
end 

outfit_product.rb

class OutfitProduct < ActiveRecord::Base 
    belongs_to :outfit 
    belongs_to :product 
end 

product.rb

class Product < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :category 
    has_many :outfit_products 
    has_many :outfits, through: :outfit_products 
end 

軍團控制器顯示

def show 
    @outfit = Outfit.find(params[:id]) 
    end 

軍團放映視圖只是部分做展示產品

<% @outfit.products.each do |product| %> 
    <div class="box panel panel-default"> 
     <div class="square_item_image"> 
     <%= link_to image_tag(product.image.url(:medium)), product %> 
     </div> 
     <div class ="panel-body"> 
     <div class = "itemlistretailer"> 
      <div class="itemlisttitle"> 
      <%= product.title %> 
      <div class = "itemlistprice"> 
       $<%= product.price %> 
      </div> 
      </div> 
      <div class="item_info"> 
      <%= image_tag product.user.avatar(:thumb) %> 
      <%= link_to product.user.username, product.user %> 
      </div> 
     </div> 
     </div> 
    </div> 
    <% end %> 

下面是部分我的架構中。請參閱裝備

create_table "outfit_products", force: :cascade do |t| 
    t.integer "product_id" 
    t.integer "outfit_id" 
    t.boolean "approved", default: false 
    t.boolean "boolean", default: false 
    t.datetime "created_at",     null: false 
    t.datetime "updated_at",     null: false 
    end 

    add_index "outfit_products", ["outfit_id"], name: "index_outfit_products_on_outfit_id" 
    add_index "outfit_products", ["product_id"], name: "index_outfit_products_on_product_id" 

    create_table "outfits", force: :cascade do |t| 
    t.string "outfit_image_file_name" 
    t.string "outfit_image_content_type" 
    t.integer "outfit_image_file_size" 
    t.datetime "outfit_image_updated_at" 
    t.integer "user_id" 
    t.datetime "created_at",    null: false 
    t.datetime "updated_at",    null: false 
    t.string "caption" 
    end 

    add_index "outfits", ["user_id"], name: "index_outfits_on_user_id" 

    create_table "products", 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 "products", ["user_id", "created_at"], name: "index_products_on_user_id_and_created_at" 
    add_index "products", ["user_id"], name: "index_products_on_user_id" 

end 

額外的信息與binding.pry

=> 19: <% binding.pry %> 
    20: <% @outfit.products.each do |product| %> 
    21:  <div class="box panel panel-default"> 
    22:  <div class="square_item_image"> 
    23:   <%= link_to image_tag(product.image.url(:medium)), product %> 
    24:  </div> 

[1] pry(#<#<Class:0x007fb2dc346480>>)> @outfit.products 
    Product Load (1.1ms) SELECT "products".* FROM "products" INNER JOIN "outfit_products" ON "products"."id" = "outfit_products"."product_id" WHERE "outfit_products"."outfit_id" = ? [["outfit_id", 18]] 
=> [#<Product:0x007fb2e2a34250 
    id: 32, 
    title: "Sparkle Shoes", 
    price: #<BigDecimal:7fb2e2a4f8e8,'0.18E3',9(27)>, 
    description: "this is test description", 
    created_at: Thu, 29 Oct 2015 09:14:50 UTC +00:00, 
    updated_at: Thu, 29 Oct 2015 09:14:50 UTC +00:00, 
    user_id: 53, 
    image_file_name: "womenshoes4.jpg", 
    image_content_type: "image/jpeg", 
    image_file_size: 86729, 
    image_updated_at: Thu, 29 Oct 2015 09:14:49 UTC +00:00, 
    category_id: 20>] 
[2] pry(#<#<Class:0x007fb2dc346480>>)> @outfit.products[0].outfit_products 
    OutfitProduct Load (10.2ms) SELECT "outfit_products".* FROM "outfit_products" WHERE "outfit_products"."product_id" = ? [["product_id", 32]] 
=> [#<OutfitProduct:0x007fb2e2b267d0 id: 5, product_id: 32, outfit_id: 17, approved: true, boolean: false, created_at: Thu, 29 Oct 2015 11:43:41 UTC +00:00, updated_at: Thu, 29 Oct 2015 11:46:05 UTC +00:00>, 
#<OutfitProduct:0x007fb2e2b26618 id: 7, product_id: 32, outfit_id: 18, approved: true, boolean: false, created_at: Thu, 29 Oct 2015 12:05:20 UTC +00:00, updated_at: Thu, 29 Oct 2015 12:05:20 UTC +00:00>, 
#<OutfitProduct:0x007fb2e2b26410 id: 8, product_id: 32, outfit_id: 21, approved: false, boolean: false, created_at: Thu, 29 Oct 2015 12:09:50 UTC +00:00, updated_at: Thu, 29 Oct 2015 12:09:50 UTC +00:00>] 
[3] pry(#<#<Class:0x007fb2dc346480>>)> 

回答

3

可以使用的第二關聯,只包括批准的產品:

class Outfit < ActiveRecord::Base 
    has_many :approved_outfit_products, -> { where(approved: true) }, 
      class_name: 'OutfitProduct' 

    has_many :approved_products, through: :approved_outfit_products, 
      class_name: 'Product' 
end 

,然後在視圖:

<% @outfit.approved_products.each do |product| %> 
+0

或使用範圍' @ outfit.products.approved.each' –

+0

產品範圍是否適用? 「批准」欄位於'outfit_products'表格中,而不是'產品' –

+0

我的不好。 SRY。 +1 –

1

你' d是能夠使用ActiveRecord Association Extension

#app/models/outfit.rb 
class Outfit < ActiveRecord::Base 
    has_many :products, through: :outfit_products do 
     def approved 
     ids = where(approved: true).pluck :product_id 
     proxy_association.target.find ids 
     end 
    end 
end 

這將允許您撥打:

@outfit = Outfit.find x 
@outfit.products.approved 

,或者如果你想避免迪米特法則:

#app/models/outfit.rb 
class Outfit < ActiveRecord::Base 
    alias_attribute :approved, to: :products, prefix: true 
end 

#-> @outfit.products_approved 
+0

該死的這是錯誤的。你可以把一個git回購?我想讓它工作 –

相關問題