0

このようにデータベースをセットアップします(STIを介して異なる種類のユーザーがいますが、「タイプ」は常にユーザーです):

class User 
  # fields
  # :id
  # :sender_id, :sender_type
  # :recipient_id, :recipient_type
end

はがきモデル:

class Postcard < ActiveRecord::Base
  belongs_to :owner, :class_name => User
  belongs_to :recipient, :class_name => User
end

User モデルを次のようにセットアップしたいと思います。

class User < ActiveRecord::Base
  has_many :postcards, :as => [:sender or :recipient] # this is not working
end

だから私は言うことができます:

user.postcards

出来ますか?

PS:私もこの道を試しました:

  has_many :postcards, :finder_sql => Proc.new { "SELECT * FROM postcards WHERE postcards.owner_id=#{id} OR postcards.recipient_id=#{id}" }

しかし、 :finder_sql がまったく新しい SQL を再作成するため、スコープに行き詰まっていることに気付きました。

  User.postcards.by_status('new').size
4

1 に答える 1

1

joelparkerhenderson が述べたように、関連付け戦略を別の方法で考える必要があります。

私がしたいように:

user.postcards

私の答えは、Postcard モデルでスコープを使用することです。

scope :of_user, lambda { |user| where("recipient_id = ? OR owner_id = ?", user.id, user.id) }

だから私は呼び出すことができます:

Postcard.of_user user

User モデルでラップすることもできます。

def postcards
   Postcard.of_user self
end
于 2012-09-28T08:58:46.353 に答える