将参数从视图传递到控制器以进行多次迭代

时间:2014-03-19 16:57:49

标签: ruby-on-rails

我的控制器正在检索以下内容:

def index
    @segments = Segment.all
    @products = Product.all
end

但这不是我想要的。我想根据其segment_id迭代产品。像这样:

def index
    @segments = Segment.all
    @products = Product.where(segment_id: x)
end

问题是:如何将x从视图传递到控制器?

我的观点是:

- @segments.each do |s|
    - @products.each do |p|
        This is a product from #{s.name}.

好的,问题在哪里?我没有展示特定细分的具体产品。我展示了所有细分的产品。我需要的是这样的事情:

- @segments.each do |s|
    - @products(segment_id: s.id).each do |p|
        This is a product from #{s.name}.
你知道吗?

2 个答案:

答案 0 :(得分:5)

在细分和产品模型之间设置has_many关联。

class Segment < ActiveRecord::Base
  has_many :products
end


class Product < ActiveRecord::Base
  belongs_to :segment
end

segment_id表中添加products

使用

生成迁移

rails g migration add_segment_id_to_products segment_id:integer:index

运行rake db:migrate

设置关联将为您提供动态方法products,您可以在视图中使用该实例进行迭代。

然后将索引操作更新为:

def index
    @segments = Segment.all
end

将视图更新为:

- @segments.each do |s|
    - s.products.each do |p|
        This is a product from #{s.name}.

答案 1 :(得分:0)

这会吗?

def index
  @segments = Segment.includes(:products).all
end

在你看来:

- @segments.each do |s|
  - s.products.each do |p|
    This is product #{p.name} from segment #{s.name}

如果你想以任何你需要的方式过滤它们,你可以为segmens和产品的查询添加条件。

Segment.includes(:products).where(:seg_val => 'something', :product => [:prod_val => 'other']).all