有以下型号:
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有更好的解决方案。提前致谢!
答案 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]
从字符串修改为字符串数组