Mongoid和ActiveRecord关系:未定义的方法`quoted_table_name'

时间:2011-08-11 13:46:20

标签: ruby-on-rails ruby activerecord mongodb mongoid

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 个答案:

答案 0 :(得分:3)

有一个名为Tenacity的有趣宝石似乎可以做你想要的,使用t_has_one,t_has_many和t_belongs_to而不是正常的关联。

因为它目前只有那些关系,所以它有点受限,而我现在正在努力与多对多,但这可能会帮助你。

请在此处查看 - https://github.com/jwood/tenacity

答案 1 :(得分:2)

我不确定这是否已经正式实施。关联主要通过ActiveRecord::Reflection来处理,{{1}}硬编码为关系表的概念,请参阅此类:

这表明ActiveRecord关联无法使用Mongoid之类的东西。

我建议构建一个gem来解决这个问题,方法是为Mongoid构建一个类似的反射包装器,或者只是手动构建相关的对象。