【问题标题】:Ruby on Rails: How do you seed the *_type column in polymorphic models?Ruby on Rails:如何在多态模型中为 *_type 列播种?
【发布时间】:2010-07-13 23:30:23
【问题描述】:

我有很多数据正在尝试植入 Rails 2.3.8 中的多态模型中。所有数据的关联都与县模型有关。数据如下:

data = Datum.create([
  ...
  { :value => '14389', :value_type => County, :value_id =>'3103'},
  { :value => '59013', :value_type => County, :value_id =>'3105'},
  { :value => '17117', :value_type => County, :value_id =>'3106'},
  ...
])

:value_type => County 值导致“String:Class 的未定义方法 `base_class'”。

我有数以万计的这些值,我想将这些值植入数据库。它们与上面的值类似,除了一些与县模型相关,一些与州模型相关,还有一些与城市模型相关。它们是静态值,在播种到数据库后不会被编辑。

如何将模型植入 :value_type 字段?

(或者......我是否错误地处理了这个问题,如果是,你会如何处理它?)

编辑:schema.rb 文件的相关部分:

艾萨克-

create_table "data", :force => true do |t|
  t.integer  "value"
  t.string   "value_type"
  t.integer  "value_id"
  t.datetime "created_at"
  t.datetime "updated_at"
end

create_table "counties", :force => true do |t|
  t.string   "name"
  t.integer  "state_id"
  t.integer  "ansi_code"
  t.string   "ansi_class"
  t.datetime "created_at"
  t.datetime "updated_at"
end

我在播种时也尝试了以下方法,但没有成功(引号中的县):

{ :value => '14389', :value_type => 'County', :value_id =>'3103'},

【问题讨论】:

  • 你能发布你的schema.rb的相关部分吗?
  • 拥有valuevalue_typevalue_id 没有意义。 Datum 模型将使用value_typevalue_id 在您使用somedatum.value 之类的内容访问另一个表时在另一个表中找到正确的记录
  • Jamie - 我按照第 1 页上的 Obie“The Rails Way”示例进行操作。 215 其中,在 Comment 模型中有 subjectsubject_idsubject_type 字段。 Comment 模型包括belongs_to :subject, :polymorphic => true,然后其他类有has_many :comments, :as => :subject。我的基准模型包括belongs_to :value, :polymorphic => true 行。我的县模型包括行has_many :data, :as => :value
  • 杰米说得对。我没看过那本书,但我不认为你的解释是正确的。另一种让我们困惑的方式是:你的种子脚本中的 14389 是什么?比如,这个数字是什么意思?如果是县 ID,3103 是什么?
  • 你真的应该给你的模型起比 Datum 更多信息的名字。一切都是数据。

标签: ruby-on-rails ruby seed polymorphism


【解决方案1】:

您绝对不需要架构中的“value”列——只需“value_id”和“value_type”。那么你的种子数据应该是这样的:

...
{ :value_id => 12345, :value_type => "County" },
...

请注意,“County”是一个带引号的字符串。

另一种选择是这样做:

{ :value => County.find(12345) }

然后 Rails 会根据 County 记录的类名和 id 自动为您设置 :value_type:value_id 列。这个例子可能会让你更好地了解正在发生的事情。但是,对于数千条记录,这会慢得多,因此第一种方法可能更适合这种情况。

【讨论】:

  • 这当然是对的,但我不清楚 OP 试图用 :value_id =>'3103' 做什么
  • 基于 OP 的架构,我希望并假设他有一个 ID 为 3103 的县记录。为了完成这项工作,县(和其他潜在的“价值”,例如城市、地区) 表必须预先填充具有这些 id 的记录。如果不是这种情况,则需要更多代码(:value => County.new([other county attributes here]) 之类的代码可能有效)。
  • 尼克是正确的。很抱歉与命名混淆。 :value 是人口数。 :value_type 指的是多态关系中的另一个模型——在本例中为 County。 :value_id 是县的 ID 号(预填充)。
【解决方案2】:

发生这种情况是因为您已在模型中执行此操作:

belongs_to :value, :polymorphic => true

因为您也尝试在表格上设置值列。 Rails 将无法区分您通过此方法设置关联或列。要设置列,请使用:

self[:value] = "something"

【讨论】:

    猜你喜欢
    • 2015-11-12
    • 2016-10-14
    • 1970-01-01
    • 2012-08-02
    • 2011-04-26
    • 1970-01-01
    • 2018-03-23
    • 2015-04-08
    • 2013-06-12
    相关资源
    最近更新 更多