通过调用控制器方法进行Rails数据库播种

Nat*_*uer 1 ruby-on-rails seeding

我想用许多“联盟”模型作为测试数据库的种子。在我的Leagues_controller中,create方法不仅创建联赛,而且还调用与每个联赛模型相关的许多初始化方法。据我所知,当我在db / seeds.rb中进行方法调用时,实际上并没有调用控制器方法(通过运行我当前在seed.rb中拥有的内容并注意各种方法来确认该方法)。初始化方法未运行)。

有什么方法可以直接在seeds.rb中调用控制器的create方法,从而不必重复代码?

这是一个例子:我想建立100个联赛。创建联赛后,我会以帮助者的方式创建球员和球队以与之并驾齐驱。我只想打电话给League.create 100次,而不用担心也要创建团队和球员。这是我的代码:

db / seeds.rb:

number = 1
number_of_teams = 8
100.times {
    league_name = "Seed" + number.to_s
    if number > 33
        number_of_teams = 10
    elsif number_of_teams > 67
        number_of_teams = 12
    end
    # Needs to be modified, we want to call the controller method
    LeaguesAndTeams::League.create(name: league_name, number_of_teams: number_of_teams)
    number += 1
}
Run Code Online (Sandbox Code Playgroud)

还有我的Leagues_controller(我简化了代码以便于阅读):

def create
        @league = LeaguesAndTeams::League.new(league_params)
        puts "In the league create method"
        respond_to do |format|
            if @league.save
                # Initialization: I know this isn't the best idea to have them here, I simply put it here for demonstration purposes.
                create_team_players
                create_teams

                # Successful creation, redirect
                format.html { redirect_to leagues_and_teams_league_path(@league.id), notice: 'League was successfully created.' }
                format.json { render :show, status: :created, location: @league }
            else
                format.html { render :new }
                format.json { render json: @league.errors, status: :unprocessable_entity }
            end
        end
    end
Run Code Online (Sandbox Code Playgroud)

Mah*_*yed 5

一个好的解决方案是在模型中使用回调。因此,在联赛模型文件中,请执行以下操作。

after_save :create_team_players, :create_teams
Run Code Online (Sandbox Code Playgroud)

现在将在create action和您的seed.rb中调用此函数