Rails :: Почему изменение атрибута не сохраняется?

#ruby-on-rails #ruby-on-rails-3 #mongoid

#ruby-on-rails #ruby-on-rails-3 #mongoid

Вопрос:

Контроллер:

 @events = Event.all
@events.each { |e| e.user_subscribed = "someuser" }
@events.each { |e| puts "error"   e.user_subscribed }
 

У меня есть attr_accessor :user_subscribed . но ошибка заключается can't convert nil into String в том, что значение e.user_subscribed равно нулю.

Я использую mongoid на серверной части.

редактировать: это работает, но он просто копирует весь массив.

 @events = @events.map do |e|
  e.user_subscribed = "faaa"
  e
end
 

Ответ №1:

Если вы не сохраняете @events в базе данных, user_subscribed не будет сохраняться, если вы не сохраните его в памяти:

 @events_with_subscription = @events.map { |e| e.user_subscribed = "someuser"; return e }
 

Комментарии:

1. Разве это не очень медленно? Разве он не копирует все события?

2. Вы также могли бы сделать это с map! помощью . Но, как упоминалось в моем ответе на ваш предыдущий вопрос, я не думаю, что это лучший способ сделать то, что вы пытаетесь достичь 🙂

3. карта! не работает, map делает, но копирует все @events . Я не хочу сохранять это в базе данных, поскольку оно ориентировано на пользователя. Кроме того, вместо user_subscribed этого он будет вызывать функцию модели в реальном коде, передавая пользователя, но это также не работает.

Ответ №2:

отредактировано на основе комментариев OP.

похоже, было бы лучше просто вывести Event.user_subscribed(current_user) непосредственно в представлении … но если вы хотите загрузить все эти данные заранее, вы могли бы сделать:

 @array_of_subscription_results = @Events.map{|e| e.user_subscribed(current_user,some,other,var,required) }
 

Пока user_subscribed возвращает интересующие вас значения, именно такая карта будет загружаться в @array_of_subscription_results

Комментарии:

1. update_attribute сохраняет его в базе данных. Это атрибут для каждого пользователя, и нет причин сохранять его в БД. Как вы можете настроить map? я не хочу дублировать весь массив

2. похоже, вы перебираете события, чтобы присвоить значение. Что вы пытаетесь сделать? соберите список всех пользователей, подписанных на каждое событие?

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

4. отредактировал исходный элемент, чтобы, надеюсь, отразить то, что вы ищете, если user_subscribed — это функция, а не поле

5. Не рекомендуется ли вызывать модель из представления? И как мне это сделать в выводе JSON?