Takma adlı has_many rayları


186

Kullanıcı modelimde şunlar olabilir:

has_many :tasks

ve Görev modelimde:

belongs_to :user

Sonra, yabancı anahtar 'kullanıcı_kimliği' görevler tablosunda saklandığını varsayarak, ben kullanabilirsiniz:

@user.tasks

Benim sorum, has_many ilişkisini nasıl bir kullanıcının Görevlerine başvurabileceğimi beyan ederim:

@user.jobs

... ya da ...

@user.foobars

Bir yığın teşekkürler.


7
Görev'i sınıf adı olarak kullanmaktan bıktım - Rails ayrılmış bir kelime ve yolda garip sorunlara neden olabilir: saklıdırwords.herokuapp.com
Joshua Pinter

Yanıtlar:


361

Bunu deneyin:

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

Not, bu polimorfik ilişkilendirmeler:as için kullanılır .


1
Yabancı anahtarı da eklediğiniz için teşekkür ederim - benzer ama farklı sorunumu çözdüm.
Niels Abildgaard

4
Bunun Görev tarafında özel bir şeye ihtiyacı var mı, yoksa normal belongs_toyeterli mi?
parlak yıldız

1
Bilginize: Bu aynı zamanda has_and_belongs_to_many dernekleri için de geçerlidir, sadece "foreign_key" parçasına gerek yoktur
David Moritz

55

alias_attributeYine de bunlara görev olarak başvurabilmek istiyorsanız da kullanabilirsiniz :

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

  has_many :tasks
end

3

@ SamSaffron'un cevabını tamamlamak için:

Sen kullanabilirsiniz class_namebiriyle foreign_keyveya inverse_of. Şahsen daha soyut beyanı tercih ediyorum, ama gerçekten sadece bir zevk meselesi:

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

ve belongs_toalt modelde özelliğe sahip olduğunuzdan emin olmanız gerekir :

class BlogPostImage
  belongs_to :blog_post
end

0

Has_many through kullanıyorsanız ve takma ad istiyorsanız:

has_many :alias_name, through: model_name, source: initial_name

-61

Bunu iki farklı şekilde yapabilirsiniz. Biri "as" kullanmaktır

has_many :tasks, :as => :jobs

veya

def jobs
     self.tasks
end

Birincisi, bununla başa çıkmanın en iyi yolu olurdu.


Teşekkürler, kulağa mükemmel geliyor. Ne yazık ki bu işe yaramadı: USER MODEL: has_many: görevleri,: as =>: created_tasks CONTROLLER: @created_tasks = @ user.created_tasks ----- # <Kullanıcı: 0xb6050b5c> için NoMethodError TasksController # index undefined yöntemi
doctororange

4
İkinci yöntem aslında birliğin takma adını oluşturmak için oldukça kullanışlıdır.
jpgeek

Sam'in dediği gibi bu uygun görünmüyor: polimorfik dernekler içindir.
Michael K Madison
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.