1

has_manyと関係の両方を持つ1つのモデルを持つ正しい(Rails)方法は何でしょうhas_oneか? 私の場合、Deviceモデルが現在の位置と以前のすべての位置の両方を追跡するようにします。これは私の試みであり、機能していますが、より良い方法はありますか?

モデル

class Location < ActiveRecord::Base
  belongs_to :device
end

class Device < ActiveRecord::Base
  has_many :locations # all previous locations
  belongs_to :location # current location
end
4

5 に答える 5

0
class Device < ActiveRecord::Base
  has_and_belongs_to_many :locations
end
于 2012-05-29T04:27:25.733 に答える
0
class Location < ActiveRecord::Base
  belongs_to :device
  has_one :current_location, :class_name => 'Device',
                              :conditions => { :active => true }
end

class Device < ActiveRecord::Base
  has_many :locations # all previous locations
end

ロケーションには、true/false に設定する「アクティブ」というブール フィールドがあります。

于 2012-05-29T12:48:20.447 に答える
0
class Location < ActiveRecord::Base
  belongs_to :device
end

class Device < ActiveRecord::Base
  has_many  :locations

  def previous_locations
    self.locations.order('created_at asc').limit( self.locations.count-1)
  end

  def current_location # or last_location
    self.locations.order('created_at desc').limit(1)
  end

  # you may like to add this one
  def current_location= args
    args = Location.new args unless args.is_a? Location
    self.locations << args
  end
end

すべての @device.locations、@device.previous_locations、および @device.current_location は ActiveRecord::Relation を返すことに注意してください。

于 2012-05-29T06:45:59.937 に答える
0

さて、Rails のやり方では、好きなように多くの関連付けを作成できます。ロジックに基づいて関連付けに名前を付けることもできます。:class_nameオプションを関連付けロジックに渡すだけです。

class Location < ActiveRecord::Base
  belongs_to :device
end

class Device < ActiveRecord::Base
  has_many :previous_locations,
           :class_name => "Location",
           :conditions => ["locations.created_at < ?", DateTime.now]
  has_one  :location,
           :class_name => "Location",
           :conditions => ["locations.created_at = ?", DateTime.now]
end
于 2012-05-29T04:33:08.607 に答える
0

「Active Record Associations のガイド」では、セクション 2.8 を読むことをお勧めします: has_many :through と has_and_belongs_to_many の選択

最も簡単な経験則は、リレーションシップ モデルを独立したエンティティとして操作する必要がある場合は、has_many :through リレーションシップを設定する必要があるということです。リレーションシップ モデルで何もする必要がない場合は、has_and_belongs_to_many リレーションシップを設定する方が簡単かもしれません (ただし、データベースに結合テーブルを作成することを覚えておく必要があります)。

結合モデルで検証、コールバック、または追加の属性が必要な場合は、 has_many :through を使用する必要があります。

http://guides.rubyonrails.org/association_basics.html#choosing-between-has_many-through-and-has_and_belongs_to_many

于 2012-05-29T04:34:34.317 に答える