2

わかりましたので、私はこのデータ構造を持っています

class User < ActiveRecord::Base
  has_many :companies, :through => :positions
  has_many :positions

class Company < ActiveRecord::Base
  has_many :positions
  has_many :users, :through => :positions

class Position < ActiveRecord::Base
  belongs_to :company
  belongs_to :user
  attr_accessible :company_id, :user_id, :regular_user
end

そして私のデータベース構造

create_table "positions", :force => true do |t|
  t.integer  "company_id"
  t.integer  "user_id"
  t.datetime "created_at",                     :null => false
  t.datetime "updated_at",                     :null => false
  t.boolean  "regular_user", :default => true
end

ユーザーの会社に別の会社を追加すると、regular_user フラグは常に true に設定されます

1.9.3-p125 :013 > @user.companies << Company.last
  Company Load (0.3ms)  SELECT `companies`.* FROM `companies` 
  ORDER BY `companies`.`id` DESC LIMIT 1
   (0.0ms)  BEGIN
  SQL (0.2ms)  INSERT INTO `positions` 
(`company_id`, `created_at`, `regular_user`, `updated_at`, `user_id`) 
VALUES 
(263, '2012-07-25 13:56:56', 1, '2012-07-25 13:56:56', 757)

挿入の前にフラグを false に設定する方法はありますか

私はこれを行うことでそれを回避してきました....これはハックです

@user.positions.update_all(:regular_user => false) if @user.is_admin?

これを達成する別の方法(クリーナー)はありますか

4

3 に答える 3

1

before_saveフィルターを使用します。
元。:

class Position

  before_save :set_regular_user_to_false

  def set_regular_user_to_false
    self.regular_user = false
  end

end

positionフィルター名が示すように、これはオブジェクトを保存する直前に一連のイベントをインターセプトするため、regular_user属性を変更できます。

編集

def set_regular_user_to_false
  if self.user.user_type != 'admin'
    self.regular_user = false
  end
  true
end
于 2012-07-25T14:07:20.137 に答える
1

位置を直接挿入できます

user.positions << Position.new(company: Company.last, regular_user: false)
于 2012-07-25T14:13:01.793 に答える
0

正直なところ、AR 移行を使用してからしばらく経っているので、本番データベースでこれを実行する前に構文を再確認してください。

そうは言っても、テーブル構造がtrueに設定されているため、これはデータベースレベルで設定されています。そのため、NULL 状況が存在する場合は true になります。

データベース列をデフォルトの false に変更する移行を実行できるはずです。@MurifoXが示唆するように、コールバックでオーバーライドすることもできますが、これはあなたの中心的な不満にうまく対処すると思います。

幸運を!

class ChangePostitionsRegularUser < ActiveRecord::Migration

  def up
    change_column :positions, :regular_user, :boolean, :default => false
  end

  def down
    change_column :positions, :regular_user, :boolean, :default => true
  end
end
于 2012-07-25T14:19:17.170 に答える