RAILS:将数据插入Join Model会出现意外行为

时间:2014-04-08 23:50:45

标签: sql ruby-on-rails postgresql

我不太明白为什么在我的连接模型中插入数据之后,他们得出了奇怪的结果。

以下是我的模特

StaffRateItem

class StaffRateItem < ActiveRecord::Base
  has_many :staff_default_rate_settings
  has_many :assignment_type_categories, through: :staff_default_rate_settings do

      def create_staff_default_rate_setting(assignment_type_category, rates_amount_attr)

            StaffDefaultRateSetting.create(rates_amount: rates_amount_attr){ self << assignment_type_category}
      end

  end

  accepts_nested_attributes_for :staff_default_rate_settings

end

AssignmentTypeCategory

class AssignmentTypeCategory < ActiveRecord::Base
  has_many :staff_default_rate_settings
  has_many :staff_rate_items, through: :staff_default_rate_settings

end

StaffDefaultRateSetting

class StaffDefaultRateSetting < ActiveRecord::Base
  belongs_to :staff_rate_item
  belongs_to :assignment_type_category
end

然后在我的 StaffDefaultRateSetting Controller 创建方法

def create

    @staff_rate_item = StaffRateItem.new(staff_rate_item_params)

    @assignment_type_category1 = AssignmentTypeCategory.find(params[:staff_rate_item][:staff_default_rate_setting][0][:assignment_type_category_id])
    @assignment_type_category2 = AssignmentTypeCategory.find(params[:staff_rate_item][:staff_default_rate_setting][1][:assignment_type_category_id])
    @assignment_type_category3 = AssignmentTypeCategory.find(params[:staff_rate_item][:staff_default_rate_setting][2][:assignment_type_category_id])

    @staff_rate_item.assignment_type_categories.create_staff_default_rate_setting @assignment_type_category1, params[:staff_rate_item][:staff_default_rate_setting][0][:rates_amount]
    @staff_rate_item.assignment_type_categories.create_staff_default_rate_setting @assignment_type_category2, params[:staff_rate_item][:staff_default_rate_setting][1][:rates_amount]
    @staff_rate_item.assignment_type_categories.create_staff_default_rate_setting @assignment_type_category3, params[:staff_rate_item][:staff_default_rate_setting][2][:rates_amount]

    respond_to do |format|
      if @staff_rate_item.save
        format.html { redirect_to staff_default_rate_settings_url, notice: 'Staff default rate setting was successfully created.' }
        format.json { render action: 'show', status: :created, location: @staff_default_rate_setting }
      else
        format.html { render action: 'new' }
        format.json { render json: @staff_default_rate_setting.errors, status: :unprocessable_entity }
      end
    end
end

StaffDefaultRateSetting基本上是StaffRateItem和AssignmentTypeCategory模型的连接模型。

因此,在其物理表下,它具有以下字段。     的 ID     staff_rate_item_id     assignment_type_category_id     rates_amount     created_at     的updated_at

所以我说的是每次我插入一个新的staff_rate_item记录时,我希望为该staff_rate_item记录包括三个其他特定的assignment_type_category字段,以及它们各自的费率金额。因此,StaffDefaultRateSetting表中的最终结果是我将在那里看到三条记录。

但我获得了以下结果。

id | staff_rate_item_id | rates_amount | created_at | updated_at | assignment_type_category_id |

18 |                    |        20.00 | 2014-04-08 22:57:25.81432  | 2014-04-08 22:57:25.81432  |                             | 
19 |                    |        20.00 | 2014-04-08 22:57:25.888068 | 2014-04-08 22:57:25.888068 |                             | 
20 |                    |        20.00 | 2014-04-08 22:57:25.915939 | 2014-04-08 22:57:25.915939 |                             | 
21 |                  6 |              | 2014-04-08 22:57:26.016725 | 2014-04-08 22:57:26.016725 |                           1 | 
22 |                  6 |              | 2014-04-08 22:57:26.021352 | 2014-04-08 22:57:26.021352 |                           2 | 
23 |                  6 |              | 2014-04-08 22:57:26.024253 | 2014-04-08 22:57:26.024253 |                           3 | 

如果仔细查看行,我会得到6条记录,而不是只有3条记录。费率金额被插入三个单独的行,而具有staff_rate_item_id和assignment_type_category_id的行被独立插入 - 没有费率金额!

这显然是非常错误的行为。

我一直在网上搜索很多,以确定我的模型创建逻辑在StaffDefaultRateSetting层上是否有问题。

 def create_staff_default_rate_setting(assignment_type_category, rates_amount_attr)
        StaffDefaultRateSetting.create(rates_amount: rates_amount_attr){ self << assignment_type_category}
 end

或者可能是插入连接模型数据的基本设置我没有掌握(并且知道)。当然,插入这种简单的连接模型创建必须是基本代码。我在这做错了什么?我正在使用PostgreSQL进行开发,而不是MySQL只是fyi。

任何想法都将不胜感激!

1 个答案:

答案 0 :(得分:0)

在花了一些时间思考这个问题之后,我又回到了绘图板并再次重做了基础知识。

这一次。我重做了StaffDefaultRateSetting Controller

中的代码
def create

    @staff_rate_item = StaffRateItem.new(staff_rate_item_params)

    @assignment_type_category1 = AssignmentTypeCategory.find(params[:staff_rate_item][:staff_default_rate_setting][0][:assignment_type_category_id])
    @assignment_type_category2 = AssignmentTypeCategory.find(params[:staff_rate_item][:staff_default_rate_setting][1][:assignment_type_category_id])
    @assignment_type_category3 = AssignmentTypeCategory.find(params[:staff_rate_item][:staff_default_rate_setting][2][:assignment_type_category_id])

    @staff_rate_item.staff_default_rate_settings.create(assignment_type_category_id: @assignment_type_category1.id, rates_amount: params[:staff_rate_item][:staff_default_rate_setting][0][:rates_amount] )
    @staff_rate_item.staff_default_rate_settings.create(assignment_type_category_id: @assignment_type_category2.id, rates_amount: params[:staff_rate_item][:staff_default_rate_setting][1][:rates_amount] )
    @staff_rate_item.staff_default_rate_settings.create(assignment_type_category_id: @assignment_type_category3.id, rates_amount: params[:staff_rate_item][:staff_default_rate_setting][2][:rates_amount] )

    respond_to do |format|
      if @staff_rate_item.save
        format.html { redirect_to staff_default_rate_settings_url, notice: 'Staff default rate setting was successfully created.' }
        format.json { render action: 'show', status: :created, location: @staff_default_rate_setting }
      else
        format.html { render action: 'new' }
        format.json { render json: @staff_default_rate_setting.errors, status: :unprocessable_entity }
      end
    end
end

我在StaffRateItem模型中取出了我的def创建方法,我觉得重写的代码应该足以完成相同的任务,而不必担心尝试花哨的代码使得保存数据工作的主要麻烦,因为我按下了时间让我的客户的项目正在进行中。干杯!