accepts_nested_attributes_for, вызывающий SQLException

Я хотел бы использовать accepts_nested_attributes_for для создания объекта статьи, который has_many разделов.

class Article < ActiveRecord::Base
  has_many :sections, :order => "position", :dependent => :destroy
  belongs_to :categories
  accepts_nested_attributes_for :sections, :allow_destroy => true, :reject_if => lambda { |attributes| attributes['title'].blank? }
  validates_presence_of :name, :on => :create, :message => "An article must have a title"
end

class Section < ActiveRecord::Base
  belongs_to :article
  acts_as_list :scope => "article"
  has_attached_file :image, 
                    :styles => { :medium => "300x300>",
                                 :thumb => "100x100>" }
end

Всякий раз, когда условие :reject_if принимает вложенный атрибут (если атрибут title не равен blank?), я вижу исключение SQLException. В противном случае статья будет успешно создана без связанных разделов.

Parameters: {"article"=>{"name"=>"My Article", "category_id"=>"7", "sections_attributes"=>{"0"=>{"title"=>"Section 1", "content"=>"Section 1 of my new article"}}}}

AREL (30.3ms)  INSERT INTO "articles" ("content", "category_id", "position", "name") VALUES (NULL, 7, NULL, 'My Article')

Section Load (0.4ms)  SELECT "sections".* FROM "sections" WHERE (article) ORDER BY position DESC LIMIT 1

SQLite3::SQLException: no such column: article: SELECT "sections".* FROM "sections" WHERE (article) ORDER BY position DESC LIMIT 1
Completed   in 68ms

Я пытаюсь выяснить, что происходит на этапе Section Load, так как WHERE (article) происходит неожиданно. Спасибо за чтение.


person grough    schedule 02.01.2011    source источник
comment
Стоит отметить: у меня возникла та же проблема с двумя другими независимыми моделями с одним и тем же отношением «один ко многим». Я использую Рельсы 3.0.3   -  person grough    schedule 03.01.2011
comment
Я предполагаю, что модель ассоциации работает найти из консоли? Попробуйте использовать вложенные атрибуты из консоли, а также попробуйте упростить объявления ассоциаций/accepts_nested, KISS.   -  person thomasfedb    schedule 04.01.2011
comment
Выполнение Article.create!({:name=>"Console Test", :sections_attributes=>[{:title=>"Section 1.1"}]}) в консоли приводит к тому же SQLException. Я попытался сократить объявление accepts_nested до самой простой формы, указав только имя вложенной модели. Как указано в вопросе, все работает, когда условие :reject_if не выполняется или вообще не объявлено. Ошибка возникает только тогда, когда вложенный объект принят.   -  person grough    schedule 04.01.2011


Ответы (1)


Ваша проблема заключается в вашем acts_as_list :scope => "article" вызове, как указано в документах act_as_list. если вы укажете строку, то гем считает, что это SQL, который он будет использовать буквально. Вы хотели использовать :article здесь, что говорит acts_as_list использовать ассоциацию :article.

person smathy    schedule 26.03.2011