0

モデルを次のように定義しました。

class Animal < ActiveRecord::Base
    mount_uploader :picture, PictureUploader

    attr_accessible :picture, :born_date, :father_id, :mother_id, :name, :obs, :earring, :animal_type, :animal_type_id, :inseminations

    validates :name, :born_date, :presence => true
    validates :earring, :presence => true, :if => :should_have_earring?

    belongs_to :father, :class_name => "Animal"
    belongs_to :mother, :class_name => "Animal"
    belongs_to :animal_type
    has_one :birth

    has_one :sell
    has_one :death

    has_many :inseminations
end

class Insemination < ActiveRecord::Base
  attr_accessible :bull_id, :cow_id, :done, :expected_birth_date, :expected_dry_date, :insemination_date, :obs, :rut

  validates :bull_id, :presence => true
  validates :cow_id, :presence => true
  validates :insemination_date, :presence => true

  belongs_to :bull, :class_name => "Animal"
  belongs_to :cow, :class_name => "Animal"

  has_one :birth
  has_one :abortion
  has_one :dry
end

良い、どこかで、私はある動物から最後の授精を取得したい...だから、私はそうする、それはうまくいくはずですが、それは授精モデルに存在しないプロパティ@animal.inseminations.lastを使用して選択を行います。animal_idしたがって、次のようなエラーが発生します。

Mysql2 :: Error:不明な列'inseminations.animal_id' in'where句':SELECT inseminations。* inseminations FROMWHERE inseminationsanimal_id= 1ORDERBY inseminationsidDESC LIMIT 1

どうすればそれをsearhincow_idおよび/またはbull_idcolumnsに指定できますか?それは可能ですか?

前もって感謝します。

4

2 に答える 2

2

私はあなたがいくつかの異なるオプションを持っていると思います:

1)を使用する代わりにhas_many :inseminations、2つの別々の作成には多くの関係があります。

has_many :cow_inseminations, :class_name => 'Insemination', :foreign_key => 'cow_id'
has_many :bull_inseminations, :class_name => 'Insemination', :foreign_key => 'bull_id'

2)STIを使用して、Animalのサブクラスを作成します。これを機能させるには、Animalにタイプフィールドを追加する必要があります。

class Cow < Animal
  has_many :inseminations, :foreign_key => 'cow_id'
end

class Bull < Animal
  has_many :inseminations, :foreign_key => 'bull_id'
end

次に、Bull.first.inseminationsまたはCow.first.inseminationsを実行できます

于 2012-09-01T14:26:16.707 に答える
1

外部キーを指定できます。

has_many :inseminations, :foreign_key => :bull_id

ただし、foreign_keyは1つしか持てないため、牛には機能しません。

Railsモデルhas_manyのようなことを複数のforeign_keysで実行して、それを機能させることができます。ただし、この場合、次のものが必要です。

has_many :bull_inseminations, :foreign_key => :bull_id
has_many :cow_inseminations, :foreign_key => :cow_id

def inseminations
  # not sure how you store animal type, but something like
  return bull_inseminations if animal_type == "bull"
  return cow_inseminations if animal_type == "cow"
end

他の属性メソッドの場合、それらを使用する場合は、同様のことを行う必要があります。例:

def inseminations_changed?
  bull_inseminations_changed? or cow_inseminations_changed?
end

同様に、inseminations <<、inseminations=などを使用します。

于 2012-09-01T14:24:03.013 に答える