Rails 3 - Money Class的Seed.rb数据

时间:2011-03-27 01:24:03

标签: ruby-on-rails ruby-on-rails-3 rubygems gem currency

我是第一次尝试seeds.rb,我的一个数据模型使用了money gem提供的封装。

相关宝石:

money (3.6.1)
rails (3.0.5)

到目前为止我的模型:

app/models/list.rb
class List < ActiveRecord::Base
  attr_accessible :alias, :unit, :participating_manufacturer, :quantity
                  :latest_price_cents, :latest_price_currency, :url
  belongs_to :user

composed_of :latest_price,
  :class_name => "Money",
  :mapping => [%w(latest_price_cents latest_price_cents), %w(latest_price_currency currency_as_string)],
  :constructor => Proc.new {
    |latest_price_cents, latest_price_currency| Money.new(latest_price_cents ||
    0, latest_price_currency || Money.default_currency)
  },
  :converter => Proc.new {
    |value| value.respond_to?(:to_money) ? value.to_money : raise(ArgumentError,
    "Can't convert #{value.class} to Money")
  }
end

1)(成功解决)

2)当我开始编写验证时,最好是为:latest_price属性或者:latest_price_cents&amp; :latest_price_currency属性分开?

/db/seeds.rb
users = User.create([{ :name => "Foo", :email => "foo@gmail.com",
                   :password => "foobar", :password_confirmation => "foobar" }])
# etc, will add more users to the array
list = List.create(:user_id => users.first.id, :alias => "Januvia 100mg",
                   :unit => "tablet", :participating_manufacturer => "Merck",
                   :quantity => 30, :latest_price_cents => 7500,
                   :latest_price_currency => "USD", :url =>
                   "http://www.foobar.com/januvia/100mg-tablets/")

3)也许它是细枝末节,但在种子中,我应该直接为virtual:latest_price属性或者latest_price_cents和latest_price_currency属性赋值吗?有没有办法使用faker而不是/db/seeds.rb来执行此任务?

我是rails和web开发的新手。

1 个答案:

答案 0 :(得分:0)

我无法在任何地方看到您的latest_price属性,因此我不确定如何回答您的问题。通常,您应验证在用户表单中输入的属性。因此,如果用户在表单中输入latest_price_centslatest_price_currency,那么他们就是需要验证的内容。

您的种子文件中存在错误。在创建新用户时,您希望传入哈希,而不是数组;并且users应该是一个数组。

users = []
users << User.create!(:name => "Foo",
                     :email => "foo@gmail.com",
                     :password => "foobar",)
                     :password_confirmation => "foobar")

但是,如果您因为想要创建一些虚拟数据而考虑使用faker,请查看MachinistFactory Girl。它们专为创建虚拟数据而设计,通常用于自动化测试。

设置了一些蓝图后,如果要在种子文件中创建虚拟数据,可以在seeds.rb中执行以下操作:

20.times { List.make } unless Rails.env.production?