我有以下的数据库架构和模型,构成了自我指涉的关联,其中一个Phrase
具有其他Phrase
S的许多翻译,通过Translation
协会:Rails的自我指涉协会加盟条件
模式:
ActiveRecord::Schema.define(version: 20151003213732) do
enable_extension "plpgsql"
create_table "phrases", force: :cascade do |t|
t.integer "language"
t.string "text"
end
create_table "translations", force: :cascade do |t|
t.integer "source_id"
t.integer "destination_id"
end
end
短语:
class Phrase < ActiveRecord::Base
has_many :translations,
class_name: "Translation",
foreign_key: "source_id"
has_many :destination_phrases,
through: :translations
has_many :inverse_translations,
class_name: "Translation",
foreign_key: "destination_id"
has_many :source_phrases,
through: :inverse_translations
enum language: [:eng, :spa, ...]
end
翻译:
class Translation < ActiveRecord::Base
belongs_to :source_phrase,
class_name: "Phrase",
foreign_key: "source_id"
belongs_to :destination_phrase,
class_name: "Phrase",
foreign_key: "destination_id"
end
现在,我想基于源语言和目的地语言运行查询。例如,我想查找英文短语及其各自的西班牙语翻译。目前,我正在根据来源查询短语,但之后我必须使用目标语言的select
方法过滤出结果。我有如下所示:
@translations = Translation.includes(:source_phrase, :destination_phrase)
.where(phrases: {language: @source_language})
# Select only destination phrases where the language matches
@translations = @translations.select {
|t| t.destination_phrase.language == @destination_language
}
我想消除select
调用,因为这绝对应该在ActiveRecord的可能。 select
将被替换为模型的where
查询中的其他参数,但我无法弄清楚如何指定它。
它应该是这个样子:
@translations =
Translation.includes(:source_phrase, :destination_phrase)
.where([source_phrase: {language: @source_language},
destination_phrase: {language: @destination_language}])
然而,ActiveRecord的认为(理所当然),该where
子句中source_phrase
和destination_phrase
是表名。所以表名仍然是phrases
,但是当我不能指定的连接条件时,两个连接,只是第一个。
如何在自我参照关联上指定两个单独的联接条件,它们都访问同一模型上的相同属性(Phrase
模型上的language
)?
是否可以查询短语而不是翻译? (短语:“目的地短语”:{语言:“西班牙语”}})' –
@LannyBose的确我可以查询短语模型,但不幸的是不是那种我正在寻找的反应 - 我最终需要的模型是一个“翻译”。在玩了大约两个小时后,并使用类似于您所建议的“加入”代码的东西后,我终于提出了解决方案。这也表明我的'短语'模型关联不正确(不奇怪)。我自我回答,如果你想看看! –