如何在Rails模型中将数组用作字段并将其转换为字符串?

时间:2015-05-13 18:26:54

标签: ruby-on-rails arrays

有以下型号:

class Post < ActiveRecord::Base
    default_scope { order(id: :desc) }

    validates :title, :content, :keywords, presence: true

    has_many :responses, dependent: :destroy

    scope :existing, ->{ where(deleted: false) }
    scope :enabled,  ->{ where(enabled: true) }
end

'keywords'是数据库中的数组列。但是从我的形式来看,我得到的不是数组,只是字符串(例如,“英格兰足球利物浦”)。所以,我想做以下事情:当我需要在我的表单中使用'keywords'字段时,Rails会将数组转换为字符串,并将空格作为分隔符;当我需要在数据库中保存对象时,Rails会将一些字符串转换为数组(['england','football','liverpool'])。我可以用很多代码来完成它,但我希望Rails有更好的解决方案。提前致谢!

2 个答案:

答案 0 :(得分:0)

虚拟属性

class Post < ActiveRecord::Base
  def teams= (*t)
    write_attribute(:teams, t.flatten.compact.uniq.join(' '))
  end

  def teams
    read_attribute(:teams).split /\s/
  end
end

答案 1 :(得分:0)

您可以执行以下操作(没有时间对此进行测试,请告诉我您是否收到错误):

# model
class Post < ActiveRecord::Base
  serlialize :teams, as: :array

# view pseudo-code
form_for @post do |f|
  # ...
  @post.teams.each do |team|
    f.text_field 'teams[]', value: team
  f.text_field 'teams[]' # for a new value

然后在提交表格后,您将收到这样的参数:

params = { post: { teams: ['liverpool', 'what ever'] } }

你可以简单地致电:

@post.update_attributes(post_params)

此代码建议为每个teams值+ 1使用1个文本字段作为新值。另一种方法是只使用一个文本字段并在特定分隔符上拆分(例如,空格,但Denver Broncos将在两个团队中拆分)但这意味着您将params[:post][:teams]从字符串修改为字符串数组