Как я могу реализовать эту ассоциацию? - PullRequest
0 голосов
/ 02 марта 2012

Я хочу реализовать функцию, с помощью которой пользователь может «добавлять новые атрибуты» в свой профиль. Здесь он должен быть в состоянии создать ярлык для деталей и фактических деталей, таких как:

Education : Degree 

, где Образование - это метка для детали, а Степень - это деталь.

Помимо этого, он также должен иметь возможность решить, следует ли делать эти детали видимыми или скрытыми.

Как я могу реализовать это, используя новую модель профиля с ассоциацией

User has_one Profile.

Если бы у меня были только метка и текст для новых деталей, я мог бы попробовать хеш, но так как мне также пришлось бы получать подробности от пользователя о том, хочет ли пользователь сделать детали hidden или visible, Мне может потребоваться дополнительное поле для хранения этого значения (true или false). Так как я могу это реализовать?

Я не могу создать has_many Profile user_id:integer name:string content:string visible:boolean, поскольку мне нужна ассоциация has_one.

Я действительно смущен тем, как я могу реализовать все это вместе.

Подскажите, пожалуйста, как я могу это реализовать, а также как я могу обновлять модель каждый раз, когда пользователь создает новую деталь, не изменяя schema базы данных.

Я работаю над Rails 3.2.

Ответы [ 2 ]

3 голосов
/ 02 марта 2012

Если в вашей таблице профилей есть столбец с именем attributes типа text

class AddAttributesToProfile < ActiveRecord::Migration
  def self.up
    add_column :profiles, :attributes, :text
  end

  def self.down
    remove_column :profiles, :attributes
  end
end

Тогда вы можете использовать метод сериализации в вашей модели:

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 голос
/ 02 марта 2012

Я бы создал его через вложенные атрибуты.

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
...