【问题标题】:Rails 3 => :has_many Xs, through => Y, ZRails 3 => :has_many Xs, through => Y, Z
【发布时间】:2011-04-19 11:08:42
【问题描述】:

我正在尝试做类似的事情

class Event < ActiveRecord::Base

  has_many    :links, :dependent => :destroy
  belongs_to  :activity
  belongs_to  :facility
  has_many    :infos, :through => :activity
  has_many    :infos, :through => :facility

  accepts_nested_attributes_for :infos

end

但这会导致has_many :infos, :through =&gt; :facility,而has_many :infos, :through =&gt; :activity 会被忽略。

如何用正确的语法表达?

编辑:

如果我实现了弗拉德的方法然后使用

@events = Event.all(:include => [:facility_infos, :activity_infos], :conditions => ["infos.language_id = ?", 2], :order => :time)

我得到:activity_infos for language_id == 2,但不幸的是我得到了所有语言的:facility_infos! 如何解决?

编辑 2:

这是您要求的输出:

SELECT "events"."id" AS t0_r0, "events"."time" AS t0_r1, "events"."everyday" AS t0_r2, "events"."activity_id" AS t0_r3, "events"."created_at " AS t0_r4, "events"."updated_at" AS t0_r5, "events"."facility_id" AS t0_r6, "events"."home" AS t0_r7, "infos"."id" AS t1_r0, "infos"."title " AS t1_r1, "infos"."description" AS t1_r2, "infos"."location" AS t1_r3, "infos"."language_id" AS t1_r4, "infos"."created_at" AS t1_r5, "infos"."updated_at " AS t1_r6, "infos"."activity_id" AS t1_r7, "infos"."facility_id" AS t1_r8, "infos"."service_id" AS t1_r9, "activity_infos_events"."id" AS t2_r0, "activity_infos_events"."title " AS t2_r1, "activity_infos_events"."description" AS t2_r2, "activity_infos_events"."location" AS t2_r3, "activity_infos_events"."language_id" AS t2_r4, "activity_infos_events"."created_at" AS t2_r5, "activity_infos_events"."updated_at " AS t2_r6, "activity_infos_events"."activity_id" AS t2_r7, "activity_infos_events"."facility_id" AS t2_r8, "activity_infos_events"."service_id" AS t2_ r9 FROM "events" 左外连接 "facilities" ON "events"."facility_id" = "facilities"."id" 左外连接 "infos" ON "infos"."facility_id" = "facility"."id" 左OUTER JOIN "activities" ON "events"."activity_id" = "activities"."id" LEFT OUTER JOIN "infos" "activity_infos_events" ON "activity_infos_events"."activity_id" = "activities"."id" WHERE (infos. language_id = 2) 按时间排序

【问题讨论】:

标签: ruby-on-rails associations


【解决方案1】:

好吧,你可以这样做:

has_many :activity_infos, :through => :activity, :source => :infos, :class_name => "Info"
has_many :facility_infos, :thorough => :facility, :source => :infos, :class_name => "Info"


def infos
  activity_infos + facility_infos
end

更新:

请显示以下输出:

Event.includes([:facility_infos, :activity_infos]).where(['infos.language_id = ?', 2]).to_sql

更新 2:

看起来像

Event.includes([:facility_infos, :activity_infos]).where(['infos.language_id = ? AND activity_infos_events.language_id = ?', 2, 2])

应该返回您期望的结果?

【讨论】:

  • 您好弗拉德,非常感谢您的回答。不幸的是,我仍然遇到一些问题......请你看看我的编辑吗?谢谢!
  • 太好了,就是这样!哦,感谢“.to_sql”技巧,这将很有用!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-04
  • 2014-09-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-06
  • 1970-01-01
相关资源
最近更新 更多