0

私には次の関連があります。

class User < ActiveRecord::Base
  has_and_belongs_to_many :brands, :join_table => 'brands_users'
  has_and_belongs_to_many :companies, :join_table => 'companies_users'
end

class Brand < ActiveRecord::Base
  belongs_to                :company
  has_and_belongs_to_many   :users, :join_table => 'brands_users'
end

class Company < ActiveRecord::Base
  has_and_belongs_to_many   :users, :join_table => 'companies_users'
  has_many :brands, :order => :name
end

ユーザーを編集している間、私はブランドのチェックボックスリストを使用しています。ユーザーにブランドへの「アクセス」を割り当てることができるように、表示されるブランドは、現在の会社に属するブランドのみです(サブドメイン[subdomain_fuを使用]によって定義されます)。

私が遭遇している問題は、デフォルトのHABTM機能とチェックボックスリストを使用するときに、保存時にRailsがすべてのユーザー->ブランドの関連付けを削除し、送信したフォームの関連付けだけを再度追加することです。

サブドメインで定義されている、現在の会社に属するブランドの関連付けのみを削除するようにスコープを設定するにはどうすればよいですか?

4

1 に答える 1

0

これが私がやったことです..私はそれをコントローラーに配置し、ユーザーを保存する前にすべての外部値を手動で追加しました。

# if admin clears all brand checkboxes the browser will ignore this change,
# so we will provide an empty array if this is the case, to make sure that
# the brands are removed
params[:user][:brand_ids] ||= []

@user = User.find(params[:id])

# collect brands for this user that are not part of this form to ensure they 
# arent removed by the rails habtm functionality
other_brands = @user.brands(:conditions => ['id NOT IN (?)', @company.brands])
other_brands.each do |ob|
  params[:user][:brand_ids] << ob.id
end

# reload the user object with the brands selected on this form, as well as 
# all their brands from other companies
@user.reload(params)

誰かがより良いアイデアを持っている場合、これがここでの最良の選択肢であるかどうかわからないので、私はまだそれを聞きたい..

于 2010-04-22T23:35:17.233 に答える