для дополнительной информации

тил весь день на Google, но не могу найти ответ. : \ У меня есть отношения HABTM между пользователями и Core_Values.

В моем контроллере мне нужно сделать две разные вещи:

class CoreValue < ActiveRecord::Base
  has_and_belongs_to_many :users

class User < ActiveRecord::Base
  has_and_belongs_to_many :core_values

Если CoreValue не существует, создайте новый и свяжите его с данным идентификатором пользователя, и

Предполагая, что я знаю, что конкретное CoreValue уже существует, создайте ассоциацию без создания каких-либо новых CoreValue или пользователей.Для # 1 у меня это работает:

Это создает новое CoreValue с: value и: creation_by и создает связь.

User.find(current_user.id).core_values.create({:value => v, :created_by => current_user.id})

Для # 2 я попробовал несколько вещей, но не могу создать ассоциацию ТОЛЬКО.

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

Вы можете сделать это в два этапа, используя очень полезные

Ответы на вопрос(3)

Решение Вопроса

 метод.find_or_create сначала попытается найти запись, и, если она не существует, создайте ее. Нечто подобное должно сработать:find_or_createНекоторые заметки:

core_value = CoreValue.find_or_create_by_value(v, :created_by => current_user.id)
current_user.core_values << core_value

Первая строка найдет или создаст значение

, Если он не существует и создан, он установитv вcreated_byТам нет необходимости делатьcurrent_user.id.так как это вернет тот же объект, что иUser.find(current_user.id) массив, и вы можете легко добавить к нему другое значение, используяcurrent_user.current_user.core_valuesДля краткости следующее будет таким же, как в примере кода выше:<<.

Спасибо! Не знал, что core_values ​​- это массив - и, конечно, не знал, что добавление в массив создаст INSERT. Сладкий! Любой способ создать ассоциацию, только если запись не существует? Я пойду смотреть методы массива, я думаю? Может быть current_user.core_values.include?

current_user.core_values << CoreValue.find_or_create_by_value(v, :created_by => current_user.id)
 jmccartie19 янв. 2011 г., 02:50
@jmccartie Вы также можете сделать
 jmccartie19 янв. 2011 г., 02:16
@jmccartie Это может быть один из способов сделать это, да. Для пояснения, я чувствую, что должен добавить, что
 vonconrad19 янв. 2011 г., 05:06
, который будет возвращать массив идентификаторов. затемcurrent_user.core_value_ids должно определенно работать.current_user.core_value_ids.include?(core_value.id)Добавьте метод в вашу пользовательскую модель:
 vonconrad19 янв. 2011 г., 02:38
 неcore_valuesвсегда массив - как вы знаете, вы можете позвонить который не является допустимым методом массива. Лучшее определение было бы, что это «действует как массив».core_values.createспасибо за продолжение. включают? не сработает пытаясь выяснить, могу ли я найти новый идентификатор core_value внутри current_user.core_values ​​... хмммм

  def assign_core_value(v)
    core_values.find_by_name(v) || ( self.core_values << 
      CoreValue.find_or_create_by_name(:name => v, :created_by => self)).last 
  end
end

 Метод соответствует требованию 1,2 и возвращает значение ядра, назначенное пользователю (с заданным именем).assign_core_valueТеперь вы можете сделать следующее:

Примечание 1

current_user.assign_core_value(v)

Логика метода заключается в следующем:

1) Проверяет, связано ли CoreValue с пользователем. Если так, никаких действий не предпринимается, возвращается значение ядра.

2) Проверяет, существует ли CoreValue с указанным именем. Если не создает CoreValue. Связывает значение ядра (создано / найдено) с пользователем.

Спасибо! Хорошая идея добавить это к пользовательской модели. Будет ли это создавать ассоциацию, если она уже существует?

 jmccartie19 янв. 2011 г., 02:51
Обновил мой ответ с некоторыми пояснениями. Посмотри.
 Harish Shetty19 янв. 2011 г., 04:03
Active Record уже дает вам метод. В твоем случае,

ции будут созданы

val = CoreValue.find_by_value(v)
current_user.core_values << val

Проверьте

это для дополнительной информацииRails: имеет и принадлежит многим (HABTM) - создайте ассоциацию без создания других за

Ваш ответ на вопрос