Я реорганизую свое приложение, чтобы везде использовать глубоко вложенные ресурсы 1 уровня, это API только для JSON. Вот урезанная версия моего routes.rb
:
resources :measurements, only: [:index, :show] do
resource :tag_node, controller: :physical_nodes, only: [:show]
resource :anchor_node, controller: :physical_nodes, only: [:show]
resource :experiment, only: [:show]
end
resources :physical_nodes, only: [:index, :show] do
resources :tag_nodes, controller: :measurements, only: [:index]
resources :anchor_nodes, controller: :measurements, only: [:index]
end
resources :experiments, only: [:index, :show] do
resources :measurements, only: [:index]
end
И мой урезанный models
:
class Measurement < ActiveRecord::Base
self.table_name = 'measurement'
self.primary_key = 'id'
belongs_to :physical_node, foreign_key: :tag_node_id
belongs_to :physical_node, foreign_key: :anchor_node_id
belongs_to :experiment, foreign_key: :experiment_id
end
class PhysicalNode < ActiveRecord::Base
self.table_name = 'physical_node'
self.primary_key = 'id'
has_many :measurements, foreign_key: :tag_node_id
has_many :measurements, foreign_key: :anchor_node_id
end
class Experiment < ActiveRecord::Base
self.table_name = 'experiment'
self.primary_key = 'id'
has_many :measurements, foreign_key: :experiment_id
end
1.:
Что работает:
GET /experiments/4/measurements.json
работает нормально
Что не работает: (все остальное ;))
GET /measurements/2/experiment.json
Сообщение об ошибке:
Processing by ExperimentsController#show as HTML
Parameters: {"measurement_id"=>"2"}
ActiveRecord::RecordNotFound (Couldn't find Experiment without an ID)
Это должно быть легко исправить. Более важным является:
2.:
GET "/measurements/2/tag_node"
Processing by PhysicalNodesController#show as HTML
Parameters: {"measurement_id"=>"2"}
Как я могу заставить рельсы называть его tag_node_id
вместо measurement_id
?
Решение:
После долгой беседы с 'dmoss18' стало ясно, что нет смысла ставить tag_nodes
и anchor_nodes
дочерними элементами physical_nodes
, так как они существуют только в таблице измерений.
Итак, теперь мой routes.rb
выглядит так:
resources :measurements, only: [:index, :show, :create]
resources :physical_nodes, only: [:index, :show]
resources :tag_nodes, only: [] do
resources :measurements, only: [:index]
end
resources :anchor_nodes, only: [] do
resources :measurements, only: [:index]
end
resources :experiments, only: [:index, :show] do
resources :measurements, only: [:index]
end
Я также удалил все эти only childs
, потому что база данных была разработана не так.
GET /measurements/2/experiment
, а затем вызову параметрid
(вместоmeasurement_id
) при переходе кExperiementsController#show
, я получу эксперимент с id=2. Но я, конечно, хочу: дайте мне эксперимент, в котором Measurement_id=2. Похоже, мне нужно построить:if(params[:measurement_id]) then @experiement = Experiment.where("measurement_id = ?", params[:measurement_id])
. Или есть более простое решение? - person Benjamin M   schedule 01.03.2013JOIN
измерения, чтобы найти правильный эксперимент, потому что Experiment_id хранится в таблице измерений. Это немного усложняет задачу, но все же может быть решено с помощью блокаif
. Но я ищу более простое/элегантное/СУХОЕ решение, если это возможно;) - person Benjamin M   schedule 01.03.2013