2017-02-20 14 views
0

Место Модель:Рубин на Rails first_or_create вложенная модель

class Place < ApplicationRecord 
    has_many :post_places, dependent: :destroy 
    has_many :posts, through: :post_places 
end 

Сообщение Модель:

class Post < ApplicationRecord 
    has_many :post_places, dependent: :destroy 
    has_many :places, through: :post_places, dependent: :destroy 

    accepts_nested_attributes_for :places, 
           :allow_destroy => true, 
           :reject_if  => :all_blank 

end 

сообщение Создать:

def create 
    @post = current_user.posts.build(post_params) 

    respond_to do |format| 
     if @post.save 
     format.html { redirect_to @post, notice: 'Post was successfully created.' } 
     format.json { render :show, status: :created, location: @post } 
     else 
     format.html { render :new } 
     format.json { render json: @post.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

Сообщение Params:

def post_params 
    params.require(:post).permit(:title, :description, :user_id, places_attributes: [:id, :title, :latitude, :longitude, :_destroy]) 
end 

При регистрации нового сообщения я хочу, чтобы он не перерегистрировался и не использовал этот идентификатор, если он зарегистрирован в базе данных. Я нашел этот код для этого, но он не принимает его, потому что он является вложенным атрибутом.

Код Im используя вместо создания:

@place = Place.where(latitude: place_params[:latitude], longitude: place_params[:longitude]).first_or_create do |place| 
    place.attributes = place_params 
end 

Спасибо за помощь!

+0

Что вы хотите: «Если существующее сообщение отправлено, я хочу связать его с новое место, вместо того, чтобы создавать оба? " – Gaston

+0

Если существующее место отправлено, я хочу связать с сообщением, но если не существует, создайте новое место – ccoeder

ответ

0

По вашему описанию говоря

«Если существующее место представляется, я хочу, связанный с должности, но если не существует создать новое место.»

Ваше требование - это примерно так, проверьте этот ответ и сообщите мне, если вам нужно что-то подобное. Чтобы мы могли двигаться дальше.

@place = Place.where(latitude: place_params[:latitude], longitude: place_params[:longitude]) 

if @place.present? // if place exist 
    @post.places << @place // push that to existing post 
else 
    @place = Place.new(latitude: place_params[:latitude], longitude: place_params[:longitude]) 
    if @place.save // else create a place 
     @post.places << @place // push that to post 
    end 
end  
+0

Благодарим вас за ответ. 1-) При создании сообщения можно выбрать несколько мест. Может ли код, который вы пишете, сделать это? 2-) Место приходит в параметр post Мне нужно написать его прямо в разделе создания сообщения? – ccoeder

+0

да, вы можете назначить любое количество мест на пост, '@post.places << @ place', это добавляет места в соответствующий пост. – Sravan

0

вы, возможно, придется настроить его немного, я думаю, что это что-то вроде этого

#will yield the place, or a new one will be initialized      
    @place = Place.where(latitude: place_params[:latitude], longitude: place_params[:longitude]).first_or_initialize(place_params) 
    #find associated post 
    @post = Post.find(post_params) 
    #add to collection 
    @place.posts << @post 

    if @place.valid? 
    @place.save 
    end 

если вы хотите другой путь вокруг

@post.places << @place 

Я не уверен " Post.find ', я думаю, что вам не хватает Post.id в ваших параметрах

+0

Нужно ли писать этот код во время создания сообщения или мне нужно писать при создании места? – ccoeder

+0

Это должно быть, когда вы создаете новое место, в частности, в своем действии, создаваемом контроллером. – Gaston