0

Rails 3 has-and-belong-to-many関連(HABTM)で多態性の関係を近似しようとしています。予想通りRails 3 HABTM - アクセス交差エンティティ

has_and_belongs_to_many :favorite_users, :class_name => "User", :join_table => "user_favorites", :association_foreign_key => "favorite_id", :foreign_key => "user_id", :conditions => "user_favorites.favorite_class='User'" 

データを取得するために、この作品:favorite_class

Userクラスでは、私が定義された関係を持っているのuser_id、favorite_id、:

交差点テーブル(user_favorites)は、これらのフィールドがあります。残念ながら、この定義は私が必要とするfavorite_class '値(この状況では' User ')を追加しません。

Arelを使用して、レコードを保存する前にfavorite_classフィールドを目的の値に設定する方法はありますか?

答えて

0

私が使用して問題を解決することができました:insert_sqlオプション(シングルクォーテーションのノートを使用する):

:insert_sql => 'INSERT INTO user_favorites (user_id, favorite_id, favorite_type) VALUES (#{id}, #{record.id}, "User")' 
+0

downvotingはしませんが、私はこれに反対します。 Railsは規約に従います。このようなsqlの挿入を行うことは、プロの生産コードには推奨されないPHPアプローチです。 –

2

has_many associationを使用すると効果的です。ここに役立つ記事があります。多相のhas_many:throughリレーションシップに関する問題を説明し、回避策を提供します。

http://blog.hasmanythrough.com/2006/4/3/polymorphic-through

これはあまりにも役に立つかもしれません:

Polymorphic habtm relationships with Rails/ActiveRecord

+0

感謝のパラメータ化クエリを使用:以下、あなたのUserFavouritesモデルでより良い使用。 – craig

+0

+1 habtmでは、結合の関連付けに余分なフィールドは使用できません。 habtmからhmtへの関連付けやそれらを使用するコードを変更するのは、最初に余分なフィールドが必要になるため、痛みを伴うため、非推奨として扱われることがよくあります。 has_many:throughは、主要な改造者なしでこれを許可します。 –

0

あなたのバリアントにSQLインジェクションがあります。

before_save :set_favourite_type 

private 

def set_favorite_type 
    self[:favorite_type] = self.favoritable.class.to_s 
end 

または少なくともその代わり応答のための#{}