我该如何实现这种关联?

时间:2012-03-02 12:33:55

标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-3.1 model

我想实现一个功能,用户可以在其个人资料中“添加新属性”。在这里,他应该能够为细节和实际细节创建标签,如:

Education : Degree 

其中教育是细节的标签,而学位是细节。

除此之外,他还应该有一个选项来决定是否应该显示或隐藏这些细节。

如何使用具有关联的新模型配置文件

来实现此功能

User has_one Profile

如果我只是使用Label和Text获取新的详细信息,我可以尝试哈希,但是因为我还需要从用户那里获取用户是否想要制作详细信息hiddenvisible,我可能需要一个额外的字段来存储该值(true或false)。那么我该如何实现呢?

我无法创建has_many Profile user_id:integer name:string content:string visible:boolean,因为我需要的是一个has_one关联。

我真的很困惑,我怎么能把整个事情一起实施。

请建议我如何实现此功能,以及每次用户创建新详细信息时如何更新模型而不更改数据库的schema

我正在研究Rails 3.2。

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