¿Hay alguna manera de detener esta inserción por defecto en los Rails?

Ok, así que tengo esta estructura de datos

class User  :positions has_many :positions class Company  :positions class Position < ActiveRecord::Base belongs_to :company belongs_to :user attr_accessible :company_id, :user_id, :regular_user end 

Y mi estructura de base de datos

 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 

Y si agrego otra compañía a las compañías de un usuario, el indicador regular_user siempre se establece en verdadero

 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) 

¿Hay una manera de establecer la bandera en falso antes de la inserción

Lo he estado logrando haciendo esto … que es un error.

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

¿Hay otra manera (más limpia) para lograr esto?

Utilice un filtro de before_save .
Ex.:

 class Position before_save :set_regular_user_to_false def set_regular_user_to_false self.regular_user = false end end 

Como dice el nombre del filtro, esto interceptará la cadena de eventos justo antes de guardar el objeto de position , por lo que puede cambiar el atributo regular_user .

EDITAR

 def set_regular_user_to_false if self.user.user_type != 'admin' self.regular_user = false end true end 

Puede insertar directamente una posición

 user.positions << Position.new(company: Company.last, regular_user: false) 

Honestamente, ha pasado un tiempo desde que usé las migraciones AR, así que revise mi syntax antes de ejecutar esto en una base de datos de producción.

Dicho esto, esto se establece en un nivel de base de datos, ya que la estructura de su tabla tiene ese valor establecido en verdadero. Así que si existe una situación NULA se hará realidad.

Debería poder ejecutar una migración que cambiará la columna de su base de datos a predeterminada en falso. También puede anularlo con una callback como sugiere @MurifoX, pero creo que esto aborda mejor su queja principal.

¡Buena suerte!

 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