我想实现一个功能,用户可以在其个人资料中“添加新属性”。在这里,他应该能够为细节和实际细节创建标签,如:
Education : Degree
其中教育是细节的标签,而学位是细节。
除此之外,他还应该有一个选项来决定是否应该显示或隐藏这些细节。
如何使用具有关联的新模型配置文件
来实现此功能 User has_one Profile
。
如果我只是使用Label和Text获取新的详细信息,我可以尝试哈希,但是因为我还需要从用户那里获取用户是否想要制作详细信息hidden
或visible
,我可能需要一个额外的字段来存储该值(true或false)。那么我该如何实现呢?
我无法创建has_many Profile user_id:integer name:string content:string visible:boolean
,因为我需要的是一个has_one关联。
我真的很困惑,我怎么能把整个事情一起实施。
请建议我如何实现此功能,以及每次用户创建新详细信息时如何更新模型而不更改数据库的schema
。
我正在研究Rails 3.2。
答案 0 :(得分:3)
假设您的个人资料表中有一个名为attributes
的文字列
class AddAttributesToProfile < ActiveRecord::Migration
def self.up
add_column :profiles, :attributes, :text
end
def self.down
remove_column :profiles, :attributes
end
end
然后您可以在模型中使用serialize方法:
class Profile < ActiveRecord::Base
serialize :attributes, Hash
end
这将允许您编写如下代码:
profile.attributes = { :education => ["Chef degree", true], :hobby => ["Cook", false] }
profile.save
哈希将以YAML格式序列化。
编辑:CRUD操作
添加或修改教育:
profile.attributes[:education] = ["Another title", true] # the boolean here represents the visibility
查询所有可见属性:
profile.attributes.each{|key, value| print "#{key.to_s.capitalize} : #{value.first}" if value.second}
删除教育:
profile.attributes.delete :education
答案 1 :(得分:1)
我会通过嵌套属性创建它。
class User < ActiveRecord::Base
has_one :profile
accepts_nested_attributes_for :profile
end
class Profile < ActiveRecord::Base
has_many :fields
accepts_nested_attributes_for :fields
end
然后在视野中,我会放这样的东西
= form_for user do |f|
= f.fields_for :profile do |p_form|
= p_form.fields_for :fields do |f_form|
= f_form :name
= f_form :value