Rails:在从另一个模型创建实例时,从模型中递增属性

时间:2015-07-03 05:37:36

标签: ruby-on-rails ruby-on-rails-4 model-view-controller orm relational-database

我们的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时,我们需要在User表中将:total_calendar_count:owner_calendar_count增加一个。

我们在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

但它似乎没有在用户表中将:total_calendar_count:owner_calendar_count更新为。

我们在这里错过了一步吗?我们应该使用更新操作吗?

2 个答案:

答案 0 :(得分:0)

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

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

current_user.save

最后。

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

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

答案 1 :(得分:0)

我最好解决你的问题如下....

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

在验证和ORM关系

之后立即在日历模型中添加以下内容
after_create :increment_counter


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

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

相关问题