Rails.Ассоциация одной модели со многими родителями - PullRequest
0 голосов
/ 31 мая 2018

Я застрял с этим.У меня есть модель Position, и мне нужно установить ассоциацию, в которой позиция может быть одновременно compounded position (имеет связанные позиции) и ingredient position (имеет позицию родителя (ей)).

Итак, я создал таблицу related_positions с :copmound_id и :ingredient_id.

Чтобы было ясно, что мне нужно в качестве вывода:

related_positions

соединение_идентификатора |ингредиент_ид |

pos_1 |pos_2

pos_1 |pos_3

pos_1 |pos_4

pos_5 |pos_2

pos_5 |pos_6

pos_5 |pos_7


pos_1.ingredients = [pos_2, pos_3, pos_4]

pos_5.ingredients = [pos_2, pos_6, pos_7]

pos_2.compounds = [pos_1, pos_5]


Это может быть что-то вроде self join, но с несколькими родителями

ОБНОВЛЕНИЕ:

Я нашел это Как смоделировать много себя-ференциальные отношения со многими родителями? .Что очень близко.Но я все еще не могу заставить его работать

Ответы [ 3 ]

0 голосов
/ 31 мая 2018

Из описания общей ассоциации может быть что-то упомянутое ниже:

class Position

 has_many :related_positions, class_name: "RelatedPosition", foreign_key: "ingredient_id", :source => :relate_position
 has_many :compounds, class_name: "RelatedPosition", foreign_key: "compound_id", :source => :compound_position
end


class RelatedPosition
 belongs_to :relate_position, class_name: "Position"
 belongs_to :compound_position, class_name: "Position"
end
0 голосов
/ 31 мая 2018

Благодаря этому посту http://blog.hasmanythrough.com/2007/10/30/self-referential-has-many-through Я получил то, что мне было нужно.

Итак, если у кого-то есть аналогичный случай, вот мое решение:

class Position < ApplicationRecord
  has_many :parents, class_name: 'RelatedPosition', foreign_key: 'ingredient_id', dependent: :destroy
  has_many :children, class_name: 'RelatedPosition', foreign_key: 'compound_id', dependent: :destroy
  has_many :compounds, through: :parents
  has_many :ingredients, through: :children
end

class RelatedPosition < ApplicationRecord
  belongs_to :ingredient, class_name: 'Position'
  belongs_to :compound, class_name: 'Position'
end
0 голосов
/ 31 мая 2018

Похоже, то, что вы хотите сделать, - это ссылка на себя
Что-то вроде этого может работать

class Position
  has_many :children, class_name: 'Position', foreign_key: 'parent_id'
  belongs_to :parent, class_name: 'Position'
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...