Ruby on Rails:在show视图中列出自连接关系的子项

时间:2014-01-05 15:52:25

标签: ruby-on-rails ruby-on-rails-4 rails-activerecord

我正在我的应用程序中构建一个分层的组织列表,使用与我用于各种对象的一对多连接相同的原则。

但是这个一对多的自联接,我得到一个错误,因为生成的SQL引用了一个不存在的organisations.organisation_id列。

以下是我的代码的一部分:

class Organisation < ActiveRecord::Base

validates :owner_id, presence: true
validates :status_id, presence: true
validates :playground_id, presence: true
belongs_to :owner, :class_name => "User", :foreign_key => "owner_id"            # helps retrieving the owner name
belongs_to :status, :class_name => "Parameter", :foreign_key => "status_id"     # helps retrieving the status name
belongs_to :parent_org, :class_name => "Organisation", :foreign_key => "parent_id"  # helps retrieving the parent name
has_many :child_orgs, :class_name => "Organisation"                         # links from the child organisations

路线(我只能从其父路线创建一个组织):

resources :organisations do
     resources :organisations, :only=>[:new, :create]
end

控制器:

# GET /organisations/1
# GET /organisations/1.json
def show
  @organisation = Organisation.includes(:owner, :status, :parent_org).find(params[:id])
end

列出当前组织的儿童的节目视图的摘录:

<table width=100%>    
  <tr><td><hr /></td></tr>
  <tr align="left">
    <th>Linked organisations</th>
    <th></th>
  </tr>
  <tr>
    <td>
      <table class="table table-striped table-condensed">
        <tr align="left">
          <th> Code </th>
          <th> Name </th>
          <th> Description </th>
          <th> Updated by </th>
          <th> Updated at </th>
        </tr>
        <%@organisation.child_orgs.each do |child_org| %>
        <tr align="left">
          <td valign="top"> <%=link_to child_org.code, child_org%> </td>
          <td valign="top"> <%=child_org.name%> </td>
          <td class="col_wide"> <%=child_org.description%> </td>
          <td valign="top"> <%=child_org.updated_by%> </td>
          <td valign="top"> <%=child_org.updated_at%> </td>
        </tr>
        <% end%>
      </table>
    </td>
  </tr>
  <tr>
    <td>
      <%= link_to 'Add organisation', new_organisation_child_org_path(@organisation) %>
    </td>
  </tr>
</table>

我收到消息: ActiveRecord :: StatementInvalid in Organizations#show ,因为生成的SQL引用了一个不存在的organisations.organisation_id列:

SELECT "organisations".* FROM "organisations"  WHERE "organisations"."organisation_id" = ?

我的问题:

1 - 我怎样才能发现这个错误?

2 - new_organisation_child_org_path(@organisation)路径是否正确用于创建子组织?

非常感谢你的帮助!

致以最诚挚的问候,

佛瑞德

2 个答案:

答案 0 :(得分:1)

您需要在has_many association上指定foreign_key:

has_many :child_orgs, :class_name => "Organisation" , :foreign_key => 'parent_id'

答案 1 :(得分:0)

在您的情况下,最好使用finder_sql或范围,具体取决于您使用哪个版本的rails来选择子组织,以避免将child_id属性添加到组织表中。

in organization.rb

Rails 3

has_many :child_orgs, class_name: "Organization", finder_sql: proc { "SELECT * FROM organizations WHERE parent_id = #{id}" }

Rails 4(未经测试)

has_many :child_orgs, ->(id) { where(parent_id: id) }, class_name: "Organization"

您需要致电的路线

new_organization_organizations_path(@organization)

键入控制台rake routes以查看所有可用路由