accepts_nested_attributes_for с двумя отношениями к одной таблице - PullRequest
0 голосов
/ 22 декабря 2011

Гости покупают Предметы у других гостей, поэтому у Предмета будут покупатель и продавец, а у Гостя будут приобретены Предметы и куплены Предметы.

class Guest < ActiveRecord::Base

  has_many :bought_items, class_name: 'Item', foreign_key: 'buyer_id'
  has_many :sold_items, class_name: 'Item', foreign_key: 'seller_id'

  accepts_nested_attributes_for :bought_items, :reject_if => lambda { |a| a[:price].blank? } , :allow_destroy => true
  accepts_nested_attributes_for :sold_items, :reject_if => lambda { |a| a[:price].blank? } , :allow_destroy => true
end

и

class Item < ActiveRecord::Base

  belongs_to :seller, class_name: 'Guest', foreign_key: 'seller_id', inverse_of: :bought_items
  belongs_to :buyer,  class_name: 'Guest', foreign_key: 'buyer_id', inverse_of: :sold_items

  attr_accessor :buyer_id, :seller_id

end

Похоже, что форма отправляет данные POST правильно (пока я только кодировал покупки), для:

Parameters: {"utf8"=>"✓", "authenticity_token"=>"9gR+GZfhT4CffM3ML9LkZaYK+eA85a1oLRG+NRqoRnY=",
 "guest"=>{
     "guest_number"=>"3",
     "bought_items_attributes"=>{
        "0"=>{
            "item_number"=>"432",
            "description"=>"test",
            "seller_id"=>"27",
            "sales_price"=>"10.0", "id"=>"1"},
        "1"=>{
            "item_number"=>"",
            "description"=>"",
            "seller_id"=>"27",
            "sales_price"=>"0.0"}
       }
  },
 "commit"=>"Save Changes",
 "id"=>"28"}

Обновления происходят для изменения guest_number, но не для любого из вложенных атрибутов. Что-то не так в настройке модели?

Это Rails 3.1.

Ответы [ 2 ]

1 голос
/ 22 декабря 2011

Ваш блок reject_if говорит, что нужно отклонить данные, если атрибут price пуст, а это - ваши данные поста имеют sales_price.

Вы также хотите избавиться от этого attr_accessor как указывает Лукапет.

0 голосов
/ 22 декабря 2011

attr_accessor - это проблема наверняка.Возможно, вы бы использовали attr_accessible .

...