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 回答