String to Serialized Array? - PullRequest
       13

String to Serialized Array?

2 голосов
/ 17 января 2011

Я уверен, что это тривиально, но последние несколько часов я бился головой о стол.Я пытаюсь преобразовать строку (то есть "key1, key2 :) в массив (т.е. [" key1 "," key2 "]) перед сохранением ее в базе данных. Я использую обратный вызов before_validation в моей модели, и этопохоже, не запускается.

Моя модель выглядит следующим образом:

class Product < ActiveRecord::Base
  serialize :keywords, Array
  attr_accessible :keywords

  before_validation :update_keywords

  def update_keywords
    self.update_attributes(:keywords, self.keywords.split(',').collect(&:strip)
  end
end

Я получаю ошибку SerializationTypeMismatch. Очевидно, что метод update_keywords не запущен или не запущеннеправильно возвращаю обновленные атрибуты.

Есть идеи?

РЕДАКТИРОВАТЬ
Я использую Rails 3.0.3, если это что-то меняет.

РЕДАКТИРОВАТЬ # 2
Просто хотел продолжить и сказать, что я обнаружил, что удаление объявления типа сериализованных столбцов и обеспечение его по умолчанию пустого массива (то есть []), ачем nil устраняет многие проблемы.

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

Ответы [ 2 ]

6 голосов
/ 17 января 2011

Измените реализацию для update_keywords следующим образом:

def update_keywords
  if keywords_changed? and keywords.is_a?(String)
    self.keywords = keywords.split(',').collect(&:strip) 
  end
end

update_attributes обновляет атрибут БД, а НЕ атрибут объекта.Чтобы присвоить значение атрибуту объекта, используйте оператор присваивания.

product.name = "Camping Gear"
product.keywords = "camping, sports"

product.save
#  ---- 
#  - "update_attributes" updates the table
#  - "save" persists current state of the object(with `keywords` set to string.)
#  - "save" fails as `keywords` is not an array
#  ---

В решении проверка changed? обеспечивает выполнение кода преобразования массива только при изменении значения ключевых слов.

0 голосов
/ 17 января 2011

Попробуйте вот так

def update_keywords
  self.keywords = self.keywords.split(",").map(&:strip) if self.keywords.is_a?(String)
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...