2016-01-15 3 views
0

В моей Node модели у меня ниже ассоциации, где два nodes связаны в Link модели:HAS_MANY через ассоциацию не работает

has_many :first_links, class_name: "Link", 
         foreign_key: "first_node_id" 
has_many :second_links, class_name: "Link", 
         foreign_key: "second_node_id" 
belongs_to :organization 

я в основном просто хочу, чтобы все ссылки, связанные с узлом, независимо является ли узел first_node или second_node. Поэтому у меня есть метод ниже в Node модели:

def links 
    first_links + second_links 
end 

Если теперь я пытаюсь Node.first.links в консоли, то это работает, и я получаю список всех ссылок на этот узел, независимо, если этот узел является первым или второй узел ссылки. Так что эти отношения, похоже, работают.

В Organization модели у меня есть:

has_many :nodes 
has_many :links, through: :nodes, source: :links 

Однако Organization.first.links в консоли генерирует ошибку:

Could not find the source association(s) "link" or :links in model Node.

Что я делаю неправильно для through ассоциации?


Update: теперь я понимаю, что мне нужен специальный метод, чтобы собрать все links для organization. Следующий из наиболее смысл для меня (добавлено к Organization модели):

has_many :nodes 
def links 
    nodes.each do |node| 
    self.links ||= []   #Create the array if it doesn't exist yet. 
    links << node.links.collect #Add all the links to the array. 
    end 
end 

Если я пытаюсь Organization.first.links в консоли, это производит ошибку ниже. Любая идея, как должен выглядеть метод?

/usr/local/rvm/gems/ruby-2.2.3/gems/activesupport-4.2.5/lib/active_support/dependencies.rb:282:in `blame_file!': can't modify frozen fatal (RuntimeError)

ответ

2

Хммм ..

можно назвать только organization.nodes и не organization.links, так как это просто метод в Node классе.

Однако вы можете создать аналогичный метод (который будет являться методом экземпляра) в классе Organization, чтобы вернуть все ссылки для всех узлов, принадлежащих экземпляру Organization, на котором вновь создан метод называется.

Например:

def links 
    self.nodes.joins(:first_links) + self.nodes.joins(:second_links) 
end 
+0

Проблема заключается в том, что мне нужно использовать ассоциацию в 'активной модели serializer'. Я не уверен, что пользовательский метод также будет работать в сериализаторе ...!? – Nick

+0

Пользовательский метод кажется возможным: https: //github.com/rails-api/active_model_serializers/blob/master/docs/general/serializers.md#overriding-association-methods. Я попробую и обновит свой оригинальный пост с помощью метода. – Nick

Смежные вопросы