Ruby on Rails collection_select复杂性

时间:2012-06-22 09:26:26

标签: ruby-on-rails associations ruby-on-rails-3.2

我有以下问题,我在客户账单视图中有以下内容

<%= 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) %>

enter image description here

ANy帮助?? :)

4 个答案:

答案 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模型。

另外,ProductStoreOpeningStock之间有什么区别?您在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] } %>