Rich many-to-many assosiation. Only allow one record

I need to limit my rich many-to-many association table to only one association per unique par. (rails).

That means i want terminals (model 1) and subscriptions (model 2) to have one custom_price (rich join) not any more than that.

How is this done most elegantly?

So far i have done:

  def new_custom_price
    @terminal_id = params[:terminal_id]
    @subscription_id = params[:subscription_id]

    @custom_price = CustomPrice.find_or_initialize_by_terminal_id_and_subscription_id( @terminal_id, @subscription_id)

    render action: 'custom_price'

  end

  def create_custom_price
    @terminal_id = params[:terminal_id]
    @subscription_id = params[:subscription_id]

    @custom_price = CustomPrice.new(custom_price_params.merge( :terminal_id => @terminal_id, :subscription_id => @subscription_id))

    respond_to do |format|
      if @custom_price.save
        format.js { render action: 'add_custom_price' }
      else
        format.js {  }
      end
    end

  end

Upvotes: 0

Views: 251

Answers (1)

omarvelous
omarvelous

Reputation: 2784

Two things you can do to handle this: (This is assuming "price" is the unique part of the many to many relationships)

1) Validation in CustomPrice

validates :price, uniqueness: {scope: [:terminal_id, :subscription_id]}

2) Use helpers

CustomPrice.find_or_create_by(custom_price_params.merge( :terminal_id => @terminal_id, :subscription_id => @subscription_id))

Upvotes: 3

Related Questions