gpt4 book ai didi

ruby-on-rails - 尝试通过 accepts_nested_attributes_for 查找或创建?

转载 作者:行者123 更新时间:2023-11-29 11:50:58 25 4
gpt4 key购买 nike

我正在尝试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。

最佳答案

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

关于ruby-on-rails - 尝试通过 accepts_nested_attributes_for 查找或创建?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8437071/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com