Ruby on Rails - 自动创建对象

时间:2016-02-02 07:36:52

标签: ruby-on-rails ruby object model-view-controller methods

在我的应用程序中,我有user表和activities表 - user有三种类型activities。我还有一个weeks表 - 每个activity的设置数为weeksuser拥有这些活动。因此weeks属于usersactivities,而activities属于users。以下是我的users表:

class SorceryCore < ActiveRecord::Migration
 def change
  create_table :users do |t|
     t.string :first_name
     t.string :surname
     t.integer :previous_award
     t.integer :chosen_award
     t.string :email,            :null => false
     t.string :crypted_password
     t.string :salt

     t.timestamps
     end

   add_index :users, :email, unique: true
  end
end

以下是我的活动表:

class CreateActivities < ActiveRecord::Migration
  def change
   create_table :activities do |t|
     t.integer :activity_type
     t.string :activity_name
     t.string :approver_email
     t.references :users, index: true, foreign_key: true

     t.timestamps null: false
     end
   end
 end

以下是我的周表:

class CreateWeeks < ActiveRecord::Migration
  def change
    create_table :weeks do |t|
      t.integer :week_num
      t.date :date_completed
      t.time :time_completed
      t.boolean :submitted
      t.boolean :approved
      t.references :activities, index: true, foreign_key: true
      t.references :users, index: true, foreign_key: true

      t.timestamps null: false
    end
  end
end

用户注册过程是一个多阶段注册。当用户注册时,他们也会创建3个活动。我想使用默认值为每个活动自动创建一些周对象。创建的周数应等于用户注册过程的输入 - 来自users表的属性称为“selected award”。 即我希望活动1的周数等​​于:

current_user.chosen_award

有没有办法为每个与当前用户相关的活动自动创建这些周对象,并使用默认值?

更新: 周模型:

class Week < ActiveRecord::Base
   belongs_to :activities
   belongs_to :users
end

活动模型:

class Activity < ActiveRecord::Base
    belongs_to :user
    has_many :weeks, dependent: :destroy

    $activity_type_var = 1;

end

用户模型:

class User < ActiveRecord::Base
    has_many :activities, dependent: :destroy
    has_many :weeks, dependent: :destroy
    authenticates_with_sorcery!
    validates :password, length: { minimum: 3 }
    validates :password, confirmation: true
    validates :email, uniqueness: true, email_format: { message: 'has invalid format' }

end

2 个答案:

答案 0 :(得分:0)

您可以在Activity模型上使用Active Record Callback after_create,并在创建Activity对象后创建Week对象。

如果我理解了您的权利,请添加到您的活动模型中:

after_create :create_weeks

def create_weeks
  user.chosen_award.times do
    weeks.create(user: user, week_num: 1) #add your default values
  end 
end

答案 1 :(得分:0)

ActiveRecord回调是一个不错的选择。我还建议您将:activity_type列重命名为:type。然后你可以使用开箱即用的单表继承,如果我理解正确,它就是你需要的。 Here is a good guide about it