Есть ли способ назначить коллекцию примитивов (например, String, Fixnum, а не пользовательских объектов) объекту, используя ActiveRecord в Rails? - PullRequest
2 голосов
/ 07 июля 2011

Я хотел бы вызвать метод получения атрибута для активного объекта записи и сделать так, чтобы он возвращал коллекцию строк, а не коллекцию пользовательских объектов.

например.

person.favourite_song_titles => ["Somewhere over the rainbow","Beat it","Poker face"]

НЕ

person.favourite_song_titles => [#FavouriteSongTitle name: "Somewhere over the rainbow",#FavouriteSongTitle name:"Beat it",#FavouriteSongTitle name:"Poker face"]

Я не хочу определять класс "FavouriteSongTitles" и делать "has_many" и "own_to", так как с этими значениями нет поведения.

В идеале я бы хотел таблицы:

create_table "people" do | t |
 #some attributes defined here
end

create_table "favourte_song_titles" | t |
  t.column "person_id", :integer
  t.column "value", :string
end

И некоторый объединяющий синтаксис, который в моем воображении будет выглядеть так:

Class Person < ActiveRecord::Base
  has_many :favourite_song_titles, :class_name => "String", #some config to tell active record which table/column to use
end

Ответы [ 2 ]

1 голос
/ 07 июля 2011

Почему бы просто не добавить новый метод?Вам не придется так сильно бороться с фреймворком.

class Person < ActiveRecord::Base
  has_many :song_titles

  def fav_song_titles
    song_titles.map(&:name)
  end
end

Другой вариант, в зависимости от того, как вы его используете, - переопределить метод to_s в классе заголовка песни:

class SongTitle < AR:Base
  def to_s
    name
  end
end

Последнее может быть удобно для просмотра, но может быть не совсем тем, что вы ищете.

0 голосов
/ 07 июля 2011

Я не знаю, как AR мог знать о таблице без связанного с ней класса модели.

Другим подходом может быть сериализация (http://api.rubyonrails.org/classes/ActiveRecord/Base.html#method-c-serialize) метод:

create_table "people" do | t |
  #some attributes defined here
  t.text :favourite_song_titles
end

Class Person < ActiveRecord::Base
  serialize :favourite_song_titles
  attr_accessor :favourite_song_titles
end

И вы сможете:

person.favourite_song_titles = ["Somewhere over the rainbow","Beat it","Poker face"]
person.save
person.reload
person.favourite_song_titles #  ["Somewhere over the rainbow","Beat it","Poker face"]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...