【问题标题】:Rails has_one :through Association for Self-Referential 1-to-1-to-1Rails has_one :通过自引用关联 1 对 1 对 1
【发布时间】:2010-12-07 16:47:42
【问题描述】:

我有一个Factsheet 模型,其中包含各种出版物,包括替代语言版本。不同的语言版本应作为单独的记录分开保存(因为它们可以单独订购/更新/等),但我试图将它们相互关联,以便您可以轻松判断一个出版物何时是西班牙语(或中文等)版本的其他。

我想使用:through 关联,以便关系是对称的,例如如果英文 Factsheet A 有一个西班牙语版本的 Factsheet B,那么同样 Factsheet B 有一个英文版本的 Factsheet A。

这是我的模型:

class Factsheet < ActiveRecord::Base
  has_many :publications_language_relationships
  has_one :en, :through  => :publications_language_relationships
  has_one :es, :through  => :publications_language_relationships
  has_one :zh, :through  => :publications_language_relationships #zh = Chinese

  # other stuff
end

还有……

# Table name: publications_language_relationships
#
#  en_id      :integer
#  es_id      :integer
#  zh_id      :integer
#
class PublicationsLanguageRelationship < ActiveRecord::Base
  belongs_to :en, :class_name => 'Factsheet'
  belongs_to :es, :class_name => 'Factsheet'
  belongs_to :zh, :class_name => 'Factsheet'
end

但是当我启动一个 Rails 控制台来检查它是否有效时......

$ fs = Factsheet.last
=> #<Factsheet id: 5, title: "Despu\xC3\xA9s de un diagn\xC3\xB3stico de c\xC3\
xA1ncer de seno: Con...", backend_code: "fs_after_bc_diagnosis_es", language: 
"es", created_at: "2010-11-30 21:23:01", updated_at: "2010-12-06 16:13:23">

$ fs.en
ActiveRecord::StatementInvalid: SQLite3::SQLException: no such column: publicati
ons_language_relationships.factsheet_id: SELECT "factsheets".* FROM "factsheets"
 INNER JOIN "publications_language_relationships" ON "factsheets".id = "publicat
ions_language_relationships".en_id WHERE (("publications_language_relationships"
.factsheet_id = 5)) LIMIT 1

所以我的联想有些不对劲,但我不太确定是什么。想法?

此外,这甚至是数据的合理设计,还是我应该在这里做一些不同的事情?

【问题讨论】:

    标签: ruby-on-rails database database-design associations


    【解决方案1】:

    我还没有测试过这个解决方案,但我认为你想要采取的总体架构方向并不是真正通过 :through 关系,而是类似于:

    class Factsheet < ActiveRecord::Base
      has_many :publications_language_relationships
    
       named_scope :translation, lambda { |trans|
          { :conditions => ["publications_language_relationships = ?", trans.to_s ] , 
            :joins => :publications_language_relationships 
          }
        }
    
      # other stuff
    end
    
    class PublicationsLanguageRelationship < ActiveRecord::Base
      belongs_to :fact_sheet
    end
    

    然后,我认为您会在控制器/视图中调用翻译,如下所示:

    #controller
    def show
       @fact_sheet = FactSheet.find( params[:id] ) # to load up the FactSheet
    end
    
    #view (to get the right translation)
    @fact_sheet.translation(:en) #for english
    

    我认为这不是绝对正确的,但无论如何它应该能让你走上正轨。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-03
      • 1970-01-01
      • 1970-01-01
      • 2019-02-26
      相关资源
      最近更新 更多