Rails has_many with alias name


186

私のユーザーモデルでは、次のことが可能です。

has_many :tasks

そして私のタスクモデルでは:

belongs_to :user

次に、外部キー「user_id」がタスクテーブルに格納されているとすると、次のように使用できます。

@user.tasks

私の質問は、ユーザーのタスクを次のように参照できるように、has_many関係をどのように宣言するかです。

@user.jobs

...または...

@user.foobars

ヒープに感謝します。


7
Taskをクラス名として使用するのはうんざりです-これはRailsの予約語であり、今後奇妙な問題を引き起こす可能性があります:reservedwords.herokuapp.com
Joshua Pinter

回答:


361

これを試してください:

has_many :jobs, foreign_key: "user_id", class_name: "Task"

これ:as多態的な関連付けに使用されます。


1
外部キーも含めてくれてありがとう-私の似ているが異なる問題を解決しました。
Niels Abildgaard、2014

4
これにはタスク側で何か特別なものが必要belongs_toですか、それとも通常は十分ですか?
明るい星

1
参考までに、これはhas_and_belongs_to_manyアソシエーションでも機能します。「foreign_key」のピースは必要ありません
David Moritz

55

alias_attributeそれらをタスクとしても参照できるようにしたい場合にも使用できます。

class User < ActiveRecord::Base
  alias_attribute :jobs, :tasks

  has_many :tasks
end

3

@SamSaffronの回答を完了するには:

あなたは使用することができますclass_nameどちらかとforeign_keyinverse_of。私は個人的にはより抽象的な宣言を好みますが、実際には好みの問題です。

class BlogPost
  has_many :images, class_name: "BlogPostImage", inverse_of: :blog_post  
end

belongs_to子モデルに属性があることを確認する必要があります:

class BlogPostImage
  belongs_to :blog_post
end

0

has_many throughを使用し、エイリアスを設定する場合:

has_many :alias_name, through: model_name, source: initial_name

-61

これには2つの方法があります。1つは、「as」を使用することです。

has_many :tasks, :as => :jobs

または

def jobs
     self.tasks
end

明らかに、最初のものがそれを処理する最良の方法でしょう。


ありがとう、それは完璧に聞こえます。残念ながらこれは機能しませんでした:ユーザーモデル:has_many:tasks、:as =>:created_tasksコントローラー:@created_tasks = @ user.created_tasks ----- NoMethodError in TasksController#index undefined method `created_tasks 'for#<User:0xb6050b5c>
doctororange 2009

4
2番目の方法は、関連付けのエイリアスを作成するのに非常に便利です。
jpgeek 2012

サムが言ったように、これは適切ではないようです:多態的な関連のためです。
マイケルKマディソン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.