2013-04-07 47 views
0

我在我的Page模型中有此关联。Rails关联finder_sql proc {}不返回所有表列

has_many :networks, :finder_sql => proc {"SELECT * FROM network_pages WHERE page1_id = #{id} OR page2_id = #{id}"} 

它通过检索在NetworkPages模型中的页面ID的Networks。他们的表如下所示:调用关联时上面我只得到记录的ID &时间戳列在回归

1.9.3p392 :010 > Network 
=> Network(id: integer, name: string, created_at: datetime, updated_at: datetime, column1: string, column2: string, inversion: boolean) 
1.9.3p392 :011 > NetworkPage 
=> NetworkPage(id: integer, network_id: integer, page1_id: integer, page2_id: integer, created_at: datetime, updated_at: datetime) 

但是:

1.9.3p392 :014 > page.networks 
=> [#<Network id: 1, created_at: "2013-04-07 09:07:05", updated_at: "2013-04-07 09:07:05">] 

它返回正确的类,但我不能叫其他属性:

1.9.3p392 :015 > page.networks.first.class 
=> Network(id: integer, name: string, created_at: datetime, updated_at: datetime, column1: string, column2: string, inversion: boolean) 
1.9.3p392 :016 > page.networks.first.name 
ActiveModel::MissingAttributeError: missing attribute: name 
    from (irb):16 
    from /Users/RyanKing/.rvm/gems/ruby-1.9.3-p392/gems/railties-3.2.12/lib/rails/commands/console.rb:47:in `start' 
    from /Users/RyanKing/.rvm/gems/ruby-1.9.3-p392/gems/railties-3.2.12/lib/rails/commands/console.rb:8:in `start' 
    from /Users/RyanKing/.rvm/gems/ruby-1.9.3-p392/gems/railties-3.2.12/lib/rails/commands.rb:41:in `<top (required)>' 
    from script/rails:6:in `require' 
    from script/rails:6:in `<main>' 

但有使用Network.find

没有问题
1.9.3p392 :017 > Network.find(1).name 
    Network Load (0.5ms) SELECT `networks`.* FROM `networks` WHERE `networks`.`id` = 1 LIMIT 1 
=> "First Network Name" 

我不太明白为什么会出现这种情况,请问如何检索所有的Network模型属性?

回答

1

你finder_sql从错误表中选择 - network_pages而不是网络

+0

是啊,我不知道为什么它虽然返回一个'network'类。 rails是否试图将返回的列适合模型? – 2013-04-07 12:54:50

+0

'has_many:networks,:finder_sql => proc {“SELECT networks。* FROM networks INNER JOIN network_pages ON networks.id = network_pages.network_id WHERE page1_id =#{id}或page2_id =#{id}”}' – 2013-04-07 12:55:40

+1

它返回一个网络,因为你说has_many网络。它不会尝试分析finder_sql的内容以查看正在使用哪些表 – 2013-04-07 12:57:17