2011-07-07 1 views
2

アクティブなレコードオブジェクトに対して属性のgetterメソッドを呼び出して、カスタム定義オブジェクトのコレクションではなく、文字列のコレクションを返すようにしたいとします。RailsでActiveRecordを使用してプリミティブのコレクション(カスタムオブジェクトではなくString、Fixnumなど)をオブジェクトに割り当てる方法はありますか?

例えば、

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の」および「belongs_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 
+0

"あなたはフレームワークと戦っているようです。なぜあなたはHABTM関係が気に入らないのですか?それはあなたのモデル関係のためのケースであるようです。 – corroded

+0

もしあなたがfavourite_song_titlesのためにテーブルを使うつもりなら、あなたは手動でSQL呼び出しをしたいのでなければ、ARを使って値を得ることができます。ちなみに、 "フレームワークとの戦い" – corroded

答えて

1

理由だけではなく、新しいメソッドを追加しませんか?そんなにフレームワークと戦う必要はありません。

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

最初のオプションI当然のことながら、私たちも一緒に行くことができますが、ActiveRecordは何の振る舞いも持たないクラスを作成しなければならないという事実は気に入らないのです。 –

0

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"] 
+0

これはオプションですが、カラムを検索するのが遅くなるかどうかはわかりません。 –

関連する問題