Связи Mongoid и ActiveRecord: неопределенный метод `quoted_table_name ' - PullRequest
3 голосов
/ 11 августа 2011
class Contest < ActiveRecord::Base
  has_one :claim_template
end

class ClaimTemplate
  include Mongoid::Document
  belongs_to :contest
end

# console
Contest.new.claim_template
#=> NoMethodError: undefined method `quoted_table_name' for ClaimTemplate:Class

хорошо, давайте добавим quoted_table_name к ClaimTemplate:

def self.quoted_table_name
  "claim_templates"
end

# console
Contest.new.claim_template
#=> nil
# Cool!
# But:
Contest.last.claim_template
#=> TypeError: can't convert Symbol into String

Так как я могу настроить мои модели для правильной работы друг с другом

PS:

Теперь у меня есть эта конструкция, которая отлично работает, но я хочу иметь преимущества Отношений (Assosiations).

class Contest < ActiveRecord::Base
  # has_one :claim_temlate
  def claim_template
    ClaimTemplate.where(:contest_id => self.id).first
  end

  # Mongoid going to be crazy without this hack
  def self.using_object_ids?
    false
  end
end

Ответы [ 2 ]

3 голосов
/ 25 октября 2011

Существует интересный драгоценный камень под названием Tenacity, который, кажется, делает то, что вам нужно, используя t_has_one, t_has_many и t_belongs_to вместо обычных ассоциаций.

Поскольку в настоящее время он имеет только те отношения, он немного ограничен,и я в настоящее время борюсь со многими ко многим, но это может вам помочь.

Проверьте это здесь - https://github.com/jwood/tenacity

2 голосов
/ 21 августа 2011

Я не уверен, было ли это официально реализовано. Ассоциации обрабатываются в основном через ActiveRecord::Reflection, что жестко закодировано в идее реляционных таблиц, см. Этот класс:

Что говорит о том, что ассоциации ActiveRecord не могут работать с такими вещами, как Mongoid.

Я рекомендую либо создать гем для решения этой проблемы, создав подобную оболочку отражения для Mongoid, либо просто создать связанные объекты вручную.

...