Rails:在从另一个模型创建实例时增加模型的属性

Rails: incrementing attribute from a model, upon creation of an instance from another model

我们的 Rails 应用适用于以下型号:

class User < ActiveRecord::Base
  has_many :administrations, dependent: :destroy
  has_many :calendars, through: :administrations
end

class Administration < ActiveRecord::Base
  belongs_to :user
  belongs_to :calendar
end

class Calendar < ActiveRecord::Base
  has_many :administrations, dependent: :destroy
  has_many :users, through: :administrations
end

这是我们的迁移:

class CreateUsers < ActiveRecord::Migration
  def change
    create_table :users do |t|
      t.string :first_name
      t.string :last_name
      t.string :email
      ...
      t.integer :total_calendar_count
      t.integer :owned_calendar_count

      t.timestamps null: false
    end
  end
end

class CreateAdministrations < ActiveRecord::Migration
  def change
    create_table :administrations do |t|
      t.references :user, index: true, foreign_key: true
      t.references :calendar, index: true, foreign_key: true
      t.string :role

      t.timestamps null: false
    end
  end
end

class CreateCalendars < ActiveRecord::Migration
  def change
    create_table :calendars do |t|
      t.string :name

      t.timestamps null: false
    end
  end
end

创建新的@calendar 时,我们需要在用户 table.

中将 :total_calendar_count:owner_calendar_count 递增 1

我们在 CalendarsController 中试过这个:

class CalendarsController < ApplicationController

  def create
    @calendar = current_user.calendars.create(calendar_params)
    current_user.total_calendar_count += 1
    current_user.owned_calendar_count += 1
    current_user.administrations.find_by(calendar_id: @calendar.id).update(role: 'Creator')
    ...
  end

但它似乎没有在用户 table.

中更新 :total_calendar_count:owner_calendar_count

我们是不是漏掉了一步?我们应该改用更新操作吗?

您代码中的实际问题是您随后没有保存用户。 因此,您更新了计数器...但这会在本地实例上更改它...然后在控制器操作完成后,您所做的更改就消失了。

如果您想保持代码原样,您可以这样做:

current_user.save

最后。

但我建议您查看 counter_cache,因为这是 Rails 方式。

此外,我还要指出,在递增计数器之前,您没有检查日历是否已成功创建……它可能无法通过验证,而实际上并没有创建……您需要先检查一下。

我有一个解决您问题的最佳想法如下....

创建一个方法,该方法将使用如下模型的回调调用创建日历...

在验证和 ORM 关系之后的日历模型中添加以下内容

after_create :increment_counter


def increment_counter
  calendar_user = self.user
  calendar_user.update(:total_calendar_count += 1, :owned_calendar_count += 1 )
end

使用上面的代码你不需要做任何事情。它将在日历的每个新条目上增加日历计数器。