我有以下问题,我在客户账单视图中有以下内容
<%= 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) %>
ANy帮助?? :)
答案 0 :(得分: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
答案 1 :(得分:3)
您需要澄清模型之间的关系......
但只是为了给你一个想法。您可以在controller
内,在与视图相关的action
内(显示集合的位置)定义要显示的产品集合。
控制器:
@products= #here you should call all products you want
然后,您的产品系列可以显示为:
<%= f.collection_select :product_id, @products,:id,:name %>
编辑
您需要修改模型之间的关系。 product
有多个customer_bills
,但您确定每个customer_bill
属于一个product
吗?
我认为你有多对多关系,因为customer_bill
也可以有很多products
。
如果我理解正确,解决方案是在这种多对多关系之间创建一个ProductLine
模型。
另外,Product
和StoreOpeningStock
之间有什么区别?您在StoreOpeningStock
中包含哪些属性?
如果您仅创建此模型以显示产品的可用性,为什么不在Product
模型中添加属性,例如名为availability
的布尔列。
答案 2 :(得分: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.in_stock而不是Product.all来存储唯一的库存。
答案 3 :(得分: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] } %>