#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?