如果在查看演示之前尚未创建,则生成加入 table 记录

Generate join table records if non yet created before view presentation

Product 模型需要通过嵌套表单更新其数据以用于连接 table

Product
  has_many :productunits, dependent: :destroy
  has_many :units, through: :productunits
Unit
  has_many :productunits, dependent: :destroy
  has_many :products, through: :productunits

调用 @productunits = Productunit.where(['product_id = ?', params[:id]]).all 时仅显示现有的产品单元。如果同时创建一个单元,则建议的列表是不完整的。 然而,编辑操作需要创建新的产品单元并填充各种初始数据,如果它们尚不存在, 之前将它们显示在视图中。

什么 ruby 语法可以达到这个结果?

更新 我已启用控制器执行以下操作

before_filter :set_product_units, :only => [:edit]
private
def set_product_tipounits
  @units = unit.where(['org_id = ?', session[:org_id]]).all
  @productunits = Productunit.order("id ASC").where(['product_id = ?', params[:id]]).all
  @units.each do |unit|
    @join_created = Productunit.where(['product_id = ? AND unit_id = ?', params[:id], unit.id]).first
    if @join_created.nil?
      @productunit = Productunit.new(:product_id => params[:id], :unit_id => unit.id, :auto_generate => false, :auto_price => false, :release_days => "30")
      @productunit.save      
    end
  end

问题已解决...

很高兴您找到了解决方案,但您的解决方案确实坚持让您的控制器知道的关于 "has_many_through" 关系的信息比它应该知道的要多。

更抽象的解决方案可能是...

在UnitController的创建方法中

def create
...
if @unit.save
  Product.all.each{|p| p.units << @unit unless p.units.include? @unit}
  ...
  end
end

类似地在 ProductController

def create
...
if @product.save
  Unit.all.each{|u| u.products << @product unless u.products.include? @product }
  ...
  end
end

编辑 您也可以将此作为模型中的回调来执行。

class Unit << ActiveRecord::Base
  after_save :add_to_products

  def add_to_products
    Product.all.each{|p| p.units << self unless p.units.include? self}
  end 
end