2015-05-29 2 views
0

Я пытаюсь получить данные о местоположении через модель доставки, у которой есть источник и пункт назначения.Множественная связь с Ruby on Rails

Я хотел бы получить доступ к информации о местоположении через вызов, как это:

Shipment.find(###).origin -> 
    :id => "###", :cs => "Springfield, Mo", :latitude => "#####", :longitude => "####" 

Shipment.find(###).dest -> 
    :id => "###", :cs => "Springfield, Mo", :latitude => "#####", :longitude => "####" 

У меня есть следующие настройки

shipment.rb:

class Shipment < ActiveRecord::Base 
    belongs_to :user 
    has_many :vehicles, dependent: :destroy 

    validates :origin_id, :dest_id, :presence => true 

    attr_accessible :origin_id, :dest_id, (more attributes...) 
end 

location.rb

class Location < ActiveRecord::Base 
    attr_accessible :cs, :latitude, :longitude 
    geocoded_by :cs 
    after_validation :geocode, :if => :cs_changed? 
    has_many :shipments, :foreign_key => :origin_id 
    has_many :shipments, :foreign_key => :dest_id 
end 

Я думаю, что это что-то вроде этого:

has_one :origin, :class => "Location", :origin_id 

или

scope :origin, -> (:origin_id) { Location.find(:origin_id)} 

ответ

2

Это может быть

class Shipment < ActiveRecord::Base 
... 

    belongs_to :origin, class: 'Location', foreign_key: 'origin_id' 
    belongs_to :dest, class: 'Location', foreign_key: 'dest_id' 

end 

Для старых рельсов

class Shipment < ActiveRecord::Base 
    ... 

     belongs_to :origin, class_name: 'Location', foreign_key: 'origin_id' 
     belongs_to :dest, class_name: 'Location', foreign_key: 'dest_id' 

end 

Тогда для места происхождения

Shipment.find(###).origin 

Тогда для размещения

Shipment.find(###).dest 
0

Поскольку ваша Shipment модель действительно имеет внешний ключ, это belongs_to :origin ситуация, я считаю. Посмотрите на RoR guides для получения дополнительной информации.

+0

назначения, но это будет 'belongs_to: location' потому что происхождение не является моделью –

+1

@BigAlRubyNewbie Параметр' belongs_to' метод определяет имя отношения. Вы можете указать имя класса ('Location'), используя опцию' class_name'. –

2

shipment.rb

class Shipment < ActiveRecord::Base 
    belongs_to :user 
    has_many :vehicles, dependent: :destroy 

    validates :origin_id, :dest_id, :presence => true 

    attr_accessible :origin_id, :dest_id 
    belongs_to :origin, :class_name => 'Location', :foreign_key => 'origin_id' 
    belongs_to :destination, :class_name =>'Location', :foreign_key => 'dest_id' 
end 
+0

'Shipment.last.origin ArgumentError: Неизвестный ключ: class' –

+0

Вы используете рельсы 3 или 4? –

+0

Я использую рельсы 3 –