2014-02-17 5 views
1

У меня есть две модели - пользователи и ключевые слова и третьи ассоциации моделей, которые соединяют пользователей и ключевые слова с отношениями has_many.Сохранение записей с has_many через отношения

У меня есть создать метод в контроллере ключевых слов, который показан ниже -

def create 
    @keyword = Keyword.new(keyword_params) 
    if Keyword.find_by(content: params[:content]).nil? 
    @keyword.save 
    end 

    @keyword.associations.create(:user_id => current_user.id) 
    flash[:success] = "Keyword successfully created!" 
    redirect_to keywords_path 

В методе «создать», упомянутую выше, после того, как пользователь добавляет ключевое слово, я проверяю, если это ключевое слово уже существует в таблицы ключевых слов, и если это не так, это сохраняет ключевое слово в таблице ключевых слов, а затем сохраняет связь между пользователем и ключевым словом в таблице ассоциаций.

Однако, когда ключевое слово уже существует в таблице ключевых слов (поскольку оно могло быть добавлено другим пользователем), и позволяет сказать, что новый пользователь добавляет это существующее ключевое слово в свой список, это дает мне ошибку - «You не может вызвать create, если родитель не будет сохранен "в строке @ keyword.associations.create, поскольку @ keyword.save пропускается (поскольку ключевое слово уже существует в базе данных).

Я использую Rails 4 и рубин 2.0.0

Я новичок в Rails и был бы признателен за любую помощь вы, ребята, можете предоставить.

Update: Добавление деталей ключевых слов модели и ключевые слова контроллера

модели: модель Пользователь:

class User < ActiveRecord::Base 
     before_save { self.email = email.downcase } 
     before_create :create_remember_token 

     has_many :associations 
     has_many :keywords, :through => :associations 

     #name 
     validates :name, presence: true, length: { maximum: 50 } 
    end 

модель Ключевое слово:

class Keyword < ActiveRecord::Base 
    has_many :questions 
    has_many :associations 
    has_many :users, :through => :associations 
    validates :content, presence: true, uniqueness: { case_sensitive: false } 
end 

ассоциации модель

class Association < ActiveRecord::Base 
     belongs_to :keyword 
     belongs_to :user 
     validates :user_id, :uniqueness => { :scope => :keyword_id } 
    end 

Ключевые слова Контроллер:

class KeywordsController < ApplicationController 
    before_action :signed_in_user, only: [:index, :edit, :update, :destroy] 

    def index 
    @keywords = current_user.keywords.to_a 
    end 

    def new 
    @keyword = Keyword.new 
    end 

    def create 
    @keyword = Keyword.find_by(content: params[:content]) 
    if @keyword.nil? 
     @keyword = Keyword.create(keyword_params) 
    end 

    @keyword.associations.create(:user_id => current_user.id) 
    flash[:success] = "Keyword successfully created!" 
    redirect_to keywords_path 
    end 

    def destroy 
    end 

    private 
    def keyword_params 
     params.require(:keyword).permit(:content) 
    end 
end 

ответ

0

Я не уверен, почему это работает, но когда я изменяю @keyword = Keyword.find_by (content: params [: content]) на @keyword = Ключевое слово .find_by (keyword_params), он работает.

0

Это происходит потому, что в том случае, если ключевое слово найдено, то по-прежнему относятся к объекту Keyword.new, который не является один в дб.

Вы можете переписать его следующим образом:

def create 
    @keyword = Keyword.find_by(content: params[:content]) 
    if @keyword.nil? 
    @keyword = Keyword.create(keyword_params) 
    end 

    @keyword.associations.create(:user_id => current_user.id) 
    flash[:success] = "Keyword successfully created!" 
    redirect_to keywords_path 
+0

Спасибо Виталию за ваш быстрый ответ.К сожалению, ваши предложенные изменения дают ту же ошибку: «Вы не можете вызвать create, если родитель не сохранен» – amey1908

+0

это может быть потому, что у родителя есть некоторые ошибки проверки, это поможет, если вы вставили содержимое класса Keyword –

+0

Hi Vitaliy, я добавил код для модели ключевых слов и контроллер в моем исходном вопросе. Пожалуйста, дайте мне знать, есть ли какие-либо проблемы с моей проверкой. Спасибо за вашу помощь. – amey1908

0

Я думаю, что проблема может быть, что вы призываете создать в модели ассоциации (через таблицу) вместо того, чтобы пользователь одного. Рельсы должны заботиться о модели ассоциации не вы, так что просто попробуйте заменить

@keyword.associations.create(:user_id => current_user.id) 

по

@keyword.users.create(:user_id => current_user.id) 

Если ничего из этого не работает, я рекомендую вам поставить точку останова в контроллере перед командой создания и вы должны увидеть, что происходит. Обратите внимание на один из моих комментариев о том, как отлаживать с помощью PRY https://stackoverflow.com/a/21815636/2793607

+0

Спасибо Рафа. Я хочу уникальные ключевые слова в таблице ключевых слов, но одно и то же ключевое слово может быть добавлено несколькими пользователями, и оно будет храниться в таблице ассоциаций. Например, у меня есть пользователь 1 и пользователь 2 в моей таблице пользователей и ключевое слово 1 и ключевое слово 2 как уникальные записи в таблице ключевых слов. Теперь оба пользователя, пользователь 1 и пользователь 2 могут иметь одно и то же ключевое слово - «ключевое слово 1» в своем списке, и это будет отражено в таблице ассоциаций. Поэтому уникальность для ключевых слов должна работать. Я не хочу, чтобы «ключевое слово 1» хранилось дважды в таблице ключевых слов. – amey1908

+0

Я добавил код для всех моделей - пользователи, ключевые слова и ассоциации – amey1908

+0

Какая ошибка вы сейчас получаете? Распечатайте точный текст. –

Смежные вопросы