2011-04-19 27 views
0

我试图做类似的Rails 3 =>:的has_many XS,通过=> Y,Z

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 => :facility,而has_many :infos, :through => :activity被忽略。

我该如何用正确的语法来表达它?

编辑:

如果我实施弗拉德的方法,然后使用

@events = Event.all(:包括=> [:facility_infos,:activity_infos]:条件=> [“的相关信息.language_id =?“,2],:order =>:time)

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

编辑2:

这里是你要求的输出:。

选择 “事件”, “ID” AS t0_r0, “事件”, “时间” 作为t0_r1, “事件”“天天“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 “ 一个S 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”LEFT OUTER JOIN“facilities”ON“events”。“facility_id”=“facilities”。“id”LEFT OUTER JOIN“infos”ON“infos”。“facility_id”=“facilities”。“id” LEFT 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)ORDER BY time

+0

http://stackoverflow.com/questions/5701175/access-has-many-relation-in-two-diferent-ways-activerecord-rails – Sector 2011-04-19 11:40:40

+0

更新了我的文章。这应该返回一个SQL查询,所以我们可以检查发生了什么 – 2011-04-19 12:50:30

+0

增加更新2 :) – 2011-04-19 14:01:56

回答

1

好吧,你可以做成fol低点:

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 

UPDATE:

请出示以下的输出:

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]) 

应该回到你的期望?

+0

嗨弗拉德,非常感谢您的答案。不幸的是,我仍然有一些问题...请你能看到我的编辑?谢谢! – Abramodj 2011-04-19 12:38:27

+0

太好了,就是这样!哦,并感谢“.to_sql”技巧,这将是有益的! – Abramodj 2011-04-19 14:04:19

相关问题