2012-05-29 72 views
1

什麼是正確的(Rails)方式來使一個模型同時具有has_manyhas_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 

回答

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 ::關係

0
class Device < ActiveRecord::Base 
    has_and_belongs_to_many :locations 
end 
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 
0

在「指南活動記錄協會」,我建議你閱讀第2.8節:選擇的has_many之間:通過和has_and_belongs_to_many

拇指的簡單規則是,你應該建立一個的has_many :通過關係,如果你需要與關係模型 作爲一個獨立的實體。如果您不需要對 關係模型執行任何操作,則可能會更簡單地設置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

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 

位置有一個布爾場稱爲'主動',你設置爲真/假。

相關問題