【问题标题】:Trying to find_or_create via accepts_nested_attributes_for?试图通过 accept_nested_attributes_for 查找或创建?
【发布时间】:2011-12-08 20:13:35
【问题描述】:

我正在尝试find_or_create 一个通过accepts_nested_attributes_for 接受的关联模型。

我有一个 Trip 模型

class Trip < ActiveRecord::Base
  attr_accessible :organiser_attributes

  accepts_nested_attributes_for :organiser
  belongs_to :organiser, class_name: 'GuestUser', :autosave => true
end

如您所见,每次旅行都属于GuestUser,他被称为组织者。

class GuestUser < ActiveRecord::Base
  attr_accessible :name, :email, :phone

  has_many :trips, foreign_key: :organiser_id
end

现在我对GuestUser 的电子邮件有唯一性约束(在验证和数据库级别)。因此,如果 GuestUser 创建了 2 次旅行,我希望将第二次旅行应用于相同的 GuestUser 记录。

我发现this questions 似乎描述了实现此目的的方法。但是,我似乎无法让它工作。

在我的Trip 模型中我添加了:

class Trip < ActiveRecord::Base
  #other stuff ...

  belongs_to :organiser, class_name: 'GuestUser', autosave: true

  def autosave_associated_records_for_organiser
    # Find or create the organiser by name
    if new_organiser = GuestUser.find_by_email(organiser.email) then
      self.organiser = new_organiser
    else
      self.organiser.save!
    end
  end
end

作为described in the docs。但是这个测试:

describe TripsController do
  describe "POST create success" do
    before :each do
      @guest_user = Factory.attributes_for(:guest_user)
      @trip = Factory.attributes_for(:trip)
      @valid_attr = @trip.merge(organiser_attributes: @guest_user)
    end

    describe "if the guest user already exists" do
      it "should still create a trip" do
        GuestUser.create! @guest_user
        expect do
          post :create, trip: @valid_attr, format: :json
        end.to change(Trip, :count).by(1)
      end
    end
  end
end

消息失败:

Failures:
  1) TripsController POST create success if the guset user already exists should still create a trip
      Failure/Error: expect do
        count should have been changed by 1, but was changed by 0
      # ./spec/controllers/trips_controller_spec.rb:26:in `block (4 levels) in <top (required)>'

这是测试日志:

  Processing by TripsController#create as JSON
  Parameters: {"trip"=>{"price"=>"3456", "origin_departure_time"=>"2011-12-13 18:08:15 +0000", "destination_arrival_time"=>"2011-12-13 20:08:15 +0000", "destination_departure_time"=>"2011-12-13 23:08:15 +0000", "origin_arrival_time"=>"2011-12-13 22:08:15 +0000", "organiser_attributes"=>{"email"=>"email@example.com", "name"=>"Peter Pan", "phone"=>"1234543534"}}}
   (0.0ms)  SAVEPOINT active_record_1
   (0.1ms)  SELECT 1 FROM "guest_users" WHERE "guest_users"."email" = 'email@example.com' LIMIT 1
   (0.0ms)  ROLLBACK TO SAVEPOINT active_record_1
Completed 422 Unprocessable Entity in 6ms (Views: 0.3ms | ActiveRecord: 0.1ms)
   (0.0ms)  SELECT COUNT(*) FROM "trips"

那是怎么回事?顺便说一句,我正在使用 Rails 3.1.3。

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 postgresql activerecord ruby-on-rails-3.1


    【解决方案1】:

    通常,您将accepts_nested_attributes_for 放在作为关系父级的模型中(也就是关联的拥有类),即包含 has_many :chidren 语句的模型。

    【讨论】:

    • 我并没有停止它的工作?我的意思是,它可以并且确实在父子关联中起作用。
    • 关键是'嵌套'这个词:你通常会发现孩子嵌套在他们父母的......巢中,反之亦然
    猜你喜欢
    • 1970-01-01
    • 2011-10-31
    • 1970-01-01
    • 2013-07-28
    • 1970-01-01
    • 2022-01-15
    • 2019-09-03
    • 1970-01-01
    • 2022-11-11
    相关资源
    最近更新 更多