如何在Rails中显示带有关联的表的记录?

时间:2019-04-22 15:25:26

标签: ruby-on-rails

我正在使用关联源as per this documentation创建表。

这里有三个具有关联和关系的表,

类别表是主表

Product 表属于categor表,其product_id引用categor(id)

销售表属于产品表,其sale_id引用产品(id)

当我运行代码迁移时,它成功了,并且可以显示categor表的内容。

现在,我还要根据此代码行显示产品销售表的内容

@prod = @categors.products.all
@sal = @prod.sales.all

但显示错误

undefine method products for #<Categor:ActiveRecord_Relation>

这是正在进行的迁移

类别迁移

class CreateCategors < ActiveRecord::Migration[5.2]
  def change
    create_table :categors do |t|
      #has_one :product
      #has_one :sale, :through => :product

      t.string :cat_name
      t.string :car_label

      t.timestamps
    end
  end
end

产品迁移

class CreateProducts < ActiveRecord::Migration[5.2]
  def change
    create_table :products do |t|
      t.belongs_to :categor, index: true
      t.string :prod_name
      t.string :prod_desc

      t.timestamps
    end
  end
end

销售迁移

class CreateSales < ActiveRecord::Migration[5.2]
  def change
    create_table :sales do |t|
      t.belongs_to :product, index: true

      t.string :sales_name
      t.string :sales_desc

      t.timestamps
    end
  end
end

categor_controller

class CategorsController < ApplicationController
  before_action :set_categor, only: [:show, :edit, :update, :destroy]
  def index

   @categors = Categor.all
   @prod = @categors.products.all
   @sal = @prod.sales.all
end

更新部分

class Categor < ApplicationRecord
end

class Product < ApplicationRecord
end

class Sale < ApplicationRecord
end

2 个答案:

答案 0 :(得分:0)

因为@prodActiveRecord_Relation,所以您不能直接处理它。 您必须映射或选择sales

@sal = @prod.each.map(&:sales)

@sal = Sale.where(product_id: @prod.ids)

ActiveRecord_Relation

答案 1 :(得分:0)

我引用了a suggestion found here,因此发现我需要将关联添加到我的所有模型中。

当他说显示所有categor数据没有意义时,我也遵循 arieljuod 的评论。

因此,首先在控制器上,我按照以下代码对表find()categor使用了product方法:

class CategorsController < ApplicationController
  before_action :set_categor, only: [:show, :edit, :update, :destroy]
  def index

   @categors = Categor.find(1)
   @prod = @categors.products.find_by_categor_id(1)
   @sal = @prod.sales.all
end

这是我的模特:

class Categor < ApplicationRecord
  has_many :products
  has_many :sales, :through => :products
end


class Product < ApplicationRecord
  belongs_to :categor
  has_many :sales

end



class Sale < ApplicationRecord
belongs_to :product
end