0

我有产品价格、产品和菜单

Product belongs_to Menu 和 ProductPrice to Product。

我正在通过茧嵌套对象一次性创建具有价格的产品。

在 ProductPrice 我有这个代码:

def menu
  self.product.menu;
end

价格取决于 product_category 和尺寸。因此,当创建新产品时,用户选择它所属的类别,然后通过 ajax 获取 product_prices,以便用户可以为该产品的每个尺寸填写价格。通过以下过程获取价格:

def self.get_product_prices(category_id, product_id)
  if category_id != "0"
    MenuCategory.find(category_id).product_sizes.map do |size|
      if product_id == "0"
        ProductPrice.new({:product_size_id => size.id })
      else
        ProductPrice.find_or_initialize_by_product_size_id_and_product_id(size.id, product_id)
      end
    end
  end
end

创建这个给我一个错误,因为产品返回为零。有没有办法获取非持久化产品所属的菜单?我可以看到 ProductPrice 有一个填充的 product_id 属性,并且始终使用填充的 menu_id 创建产品。

4

4 回答 4

0

我在 has_one/belongs_to 关系中遇到了类似的问题,其中每个人都验证了另一个人的存在。特别是在测试代码中,这使得在不绕过验证或溢出堆栈的情况下存根其中一个成为一项挑战。

解决方案是:

FactoryGirl.define do
  factory :person do
    ignore do
      skip_address false
    end
    after(:build) do |person, evaluator|
      person.address ||= FactoryGirl.build(:address, :person => person) unless evaluator.skip_address
    end
  end
  factory :address do
    ignore do
      skip_person false
    end
    after(:build) do |address, evaluator|
      address.person ||= FactoryGirl.build(:person, :address => address) unless evaluator.skip_person
    end
  end
end

当您想要测试验证代码时,忽略允许您覆盖。

更好的设计方法是将其全部制作为一张表,但不幸的是,它是一个遗留数据库。

于 2013-11-08T14:56:32.390 回答
0

必须将 def 菜单更改为:

def menu
  if !self.product.nil?
    self.product.menu
  end
end
于 2013-11-08T01:01:07.307 回答
0

我将从上面的答案中获取以下模型设置作为示例

class Menu < ActiveRecord::Base
  has_many :products
end 

class Product < ActiveRecord::Base
  belongs_to :menu
  has_one :product_price
end    

现在,很简单,您只需要:inverse_of在 Menu 和 Product 类上添加关联,如下所示:

class Menu < ActiveRecord::Base
  has_many :products, inverse_of: :menu
end

class Product < ActiveRecord::Base
  belongs_to :menu, inverse_of: :product
  has_one :product_price
end

现在如果你做这样的事情:

menu = Menu.new
product = menu.products.new
product.menu

你得到你的菜单对象而不是 nil

于 2015-01-18T07:27:44.333 回答
0

Assuming your classes are defined as follows:

class Menu < ActiveRecord::Base
  has_many :products
end

class Product < ActiveRecord::Base
  belongs_to :menu
  has_one :product_price
end

class ProductPrice < ActiveRecord::Base
  belongs_to :product

  def menu
    product.menu
  end
end

The problem you're describing can only occur if product is indeed not assigned. With that said you may need to write tests to make sure that whatever part of your application that is accessing product as nil either does not happen or handled graciously. Also, maybe add a validation to make sure ProductPrice has an association to Product when each object is created.

class ProductPrice < ActiveRecord::Base
  belongs_to :product

  validates :product, :presence => true

  def menu
    product.menu
  end
end
于 2013-05-25T23:24:33.967 回答