4

私は次の問題を抱えています。顧客の請求書ビューには次のような問題があります

<%= f.collection_select :product_id,Product.all,:id,:name %>

これは、「製品」モデルからすべての製品のリストを取得し、そこから選択するオプションを提供しています。しかし、「StoreOpeningStock」モデルから製品のリストを選択したいと考えています。

私は自分のモデルにこれらを持っています

class Product< ActiveRecord::Base
has_many :store_opening_stocks
has_many :customer_bills
attr_accessible :name
end


class StoreOpeningStock < ActiveRecord::Base
attr_accessible :product_id
belongs_to :product 
end


class CustomerBill < ActiveRecord::Base
attr_accessible :product_id
 belongs_to :product
accepts_nested_attributes_for :store_opening_stock
end

store_opening_stock から製品名と ID を取得する方法を教えてもらえますか? ヘルパーを使用する必要がありますか??? または他の方法はありますか?? 前もって感謝します

ヘルパーを使ってみた

def getting_prod_names
        @sto = StoreOpeningStock.all

          for x in @sto
        [
            ['{x.product.title}', '{x.product_id}']
        ]
    end
    end

次の出力を取得する

<%= f.select :product_id, options_for_select(getting_prod_names) %>

ここに画像の説明を入力

何か助けて?? :)

4

4 に答える 4

3

モデル間の関係を明確にする必要があります...

しかし、あなたにアイデアを与えるためだけに。ビュー(コレクションを表示している場所)に関連するcontroller内部で、表示する製品のコレクションを定義できます。action

コントローラ:

@products= #here you should call all products you want

次に、製品のコレクションを次のように表示できます。

<%= f.collection_select :product_id, @products,:id,:name %>

編集

モデル間の関係を修正する必要があります。Aproductにはたくさんありますが、それぞれが1つに属してcustomer_billsいると確信していますか?多対多の関係も あると思います。 私がそれを正しく理解していれば、解決策はこの多対多の関係の間にモデルを作成することです。customer_billproduct
customer_billproducts
ProductLine

Productまた、との違いは何StoreOpeningStockですか?どの属性を含めましたStoreOpeningStockか?製品の可用性を示すためだけにこのモデルを作成した場合は、モデルに属性(たとえば、。というブール列)
を追加してみませんか。Productavailability

于 2012-06-22T11:53:57.993 に答える
3

フォームを作成するとき、作成に使用されるデータはcollection_select、オブジェクトを作成するクラスに限定されません。次のように簡単に実行できます。

<%= f.collection_select :product_id,StoreOpeningStock.all,:product_id ,:name %>

これはあなたのためにそれをする必要があります...

StoreOpeningStockこれをクラスに追加します:

def name
    return self.product.name unless self.product.nil?
    ""
end
于 2012-06-22T11:22:33.790 に答える
1

したがって、StoreOpeningStockを持つすべての製品を検索する必要があります。これは単にモデルの問題であり、ヘルパーとは何の関係もありません。

class Product
  # Find all products that have a StoreOpeningStock
  def self.in_stock
    find(StoreOpeningStock.product_ids)
  end
end

class StoreOpeningStock
  # Collect all product ids from stocks
  def self.product_ids
    uniq.pluck(:product_id)
  end
end

これで、Product.allの代わりにProduct.in_stockを使用して、在庫を1つだけ持つことができます。

于 2012-06-22T12:58:45.653 に答える
1

製品モデルにスコープを追加します。

class Product< ActiveRecord::Base
    has_many :store_opening_stocks
    has_many :customer_bills
    attr_accessible :name

    scope :having_store_opening_stocks, :joins => : store_opening_stocks, :select => 'distinct product.*', :conditions => 'store_opening_stocks.product > 0'
end

次に、 Product.all.having_store_opening_stocks を使用して、そのような在庫を持つ製品のみを選択できます。次に例を示します。

<%= f.select :product_id, Product.having_store_opening_stocks.map { |product| [product.name, product.id] } %>
于 2012-06-22T15:58:40.870 に答える