Ruby on rails 试图通过接受\u嵌套的\u属性\u查找\u或\u创建?
我正在尝试Ruby on rails 试图通过接受\u嵌套的\u属性\u查找\u或\u创建?,ruby-on-rails,ruby-on-rails-3,postgresql,activerecord,ruby-on-rails-3.1,Ruby On Rails,Ruby On Rails 3,Postgresql,Activerecord,Ruby On Rails 3.1,我正在尝试查找或创建一个关联的模型,该模型通过接受的嵌套属性被接受 我有一个旅行模型 class Trip < ActiveRecord::Base attr_accessible :organiser_attributes accepts_nested_attributes_for :organiser belongs_to :organiser, class_name: 'GuestUser', :autosave => true end 现在我对GuestUse
查找或创建一个关联的模型,该模型通过接受
的嵌套属性被接受
我有一个旅行模型
class Trip < ActiveRecord::Base
attr_accessible :organiser_attributes
accepts_nested_attributes_for :organiser
belongs_to :organiser, class_name: 'GuestUser', :autosave => true
end
现在我对GuestUser
的电子邮件有一个唯一性约束(在验证和数据库级别)。因此,如果一个GuestUser创建了两个trip,我希望第二个trip应用于同一个GuestUser记录
我发现这似乎描述了实现这一目标的方法。然而,我似乎无法让它工作
在我的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
失败,并显示以下消息:
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)>'
怎么回事?顺便说一句,我使用的是Rails 3.1.3。通常情况下,您将接受的\u嵌套的\u属性\u放在作为关系父级的模型中(也称为关联的拥有类),即包含has\u many:children语句的模型中。但我没有停止它的工作吗?我的意思是,它可以并且确实从父关联和子关联中起作用。关键是“嵌套”一词:您通常会在父关联中发现嵌套的子关联。。。嵌套,而不是相反
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"