如何在Model中设置一个属性?

时间:2014-01-16 04:11:11

标签: ruby-on-rails arrays model attributes migrate

你能教我如何在Model中为Array设置一个属性吗?

我试过了但是当我使用像pusheach这样的数组方法时,我收到错误undefined method `push' for nil:NilClass

我的迁移看起来像这样:

class CreateContacts < ActiveRecord::Migration
  def change
    create_table :contacts do |t|
      t.string :name
      t.string :email
      t.string :email_confirmation
      t.integer :city_ids, array: true
      t.text :description

      t.timestamps
    end
  end
end

我想将属性city_ids设置为Array。

2 个答案:

答案 0 :(得分:3)

在模型上与数组(或其他可变值)交互时需要注意的一件重要事项。 ActiveRecord目前不会跟踪“破坏性”或“就地改变”。这些包括数组推送和弹出,推进DateTime对象。 实施例

 john = User.create(:first_name => 'John', :last_name => 'Doe',
  :nicknames => ['Jack', 'Johnny'])

john = User.first

john.nicknames += ['Jackie boy']
# or
john.nicknames = john.nicknames.push('Jackie boy')
# Any time an attribute is set via `=`, ActiveRecord tracks the change
john.save

推荐 - link

答案 1 :(得分:1)

您需要设置默认值。否则,该属性为nil,直到您为其指定值:

  t.integer :city_ids, array: true, default: []

或者,你需要给它一个值,因为你试图使用它:

c = City.find(...)

c.city_ids ||= []

c.city_ids.push(...)