1

スキーマ:

  • persons (id, name, birthyear, gender)

  • pets (id, person_id, name, leg_count)

  • plants (id, person_id, kind, qty)

これらのことについて、人物ごとにグループ分けして、読み取り専用のレポートを作成したいと思います。個人のリストが作成されます (関連するレコードはありません)。1人あたりの「サブテーブル」が欲しいです。何かのようなもの:

Persons
+----+------+-----------+--------+
| id | name | birthyear | gender |
+----+------+-----------+--------+
|  1 | Joe  | 1980      | M      |
+----+------+-----------+--------+
| Pets                           |
| +----+------+-----------+      |
| | id | name | Leg count |      |
| +----+------+-----------+      |
| |  1 | Rex  |         4 |      |
| +----+------+-----------+      |
| |  2 | Ka   |         0 |      |
| +----+------+-----------+      |
| Plants                         |
| +----+------------+-----+      |
| | id | kind       | qty |      |
| +----+------------+-----+      |
| |  1 | lemon tree |   2 |      |
| +----+------------+-----+      |
+----+------+-----------+--------+
|  2 | Jane | 1982      | F      |
+----+------+-----------+--------+
| Pets                           |
| +----+------+-----------+      |
| | id | name | Leg count |      |
| +----+------+-----------+      |
| |  3 | Sue  |         6 |      |
| +----+------+-----------+      |
| Plants                         |
| +----+------------+-----+      |
| | id | kind       | qty |      |
| +----+------------+-----+      |
| |  2 | Oak tree   |   1 |      |
| +----+------------+-----+      |
+----+------+-----------+--------+

フレームワークにフックする場所と方法のヒントを教えてください。(JRuby (1.5.0)、Ruby on Rails (2.3.4)、ActiveRecord (2.3.4) )

行われること

Persons
+----+------+-----------+--------+
| id | name | birthyear | gender |
+----+------+-----------+--------+
|  1 | Joe  | 1980      | M      |
+----+------+-----------+--------+
|  2 | Jane | 1982      | F      |
+----+------+-----------+--------+

それは以下を使用して行われます。

class PersonsReportController < PersonsController
  layout 'simpreport'
  active_scaffold :person do |config|
    c.columns = [:name, :birthyear, :gender, :pets, :plants ]
    c.label = "Report of people and other living creatures"
    [:pets, :plants].each do |col| 
        columns[col].clear_link
    end
    c.list.columns.exclude :pets, :plants
    c.actions.exclude :show
  end
  # ...
end

また、すべての対話機能 (注文など) を無効にするために_list_header.rhtml、 、_list_column_headings.rhtml、および_list_actions.rhtmlを少しカスタマイズしました。

4

2 に答える 2

5

コントローラーに記述したコードも、PersonsController から継承する理由もわかりません。たぶん、あなたがそこで達成しようとしていることをもう少し説明できますか?

そうは言っても、私はあなたの問題を次のように解決します:

モデル:

person.rb:

class Person < ActiveRecord::Base
  has_many :pets
  has_many :plants

  def has_pets?
    self.pets.size > 0
  end

  def has_plants?
    self.plants.size > 0
  end

  def has_pets_or_plants?
    self.has_pets? || self.has_plants?
  end
end

ペット.rb:

class Pet < ActiveRecord::Base
  belongs_to :person
end

植物.rb:

class Plant < ActiveRecord::Base
  belongs_to :person
end

コントローラ:

reports_controller.rb:

class ReportsController < ApplicationController
  def index
    @persons = Person.find(:all)
  end
end

意見:

レポート/index.html.erb:

Persons
<table border="1">
  <tr>
    <td>id</td>
    <td>name</td>
    <td>birthyear</td>
    <td>gender</td>
  </tr>
<% @persons.each do |person| -%>
  <tr>
    <td><%= person.id %></td>
    <td><%= person.name %></td>
    <td><%= person.birthyear %></td>
    <td><%= person.gender %></td>
  </tr>
<% if person.has_pets_or_plants? -%>
  <tr>
    <td colspan="4">
    <% if person.has_pets? -%>
      Pets
      <table border="1">
        <tr>
          <td>id</td>
          <td>name</td>
          <td>leg count</td>
        </tr>
      <% person.pets.each do |pet| -%>
        <tr>
          <td><%= pet.id %></td>
          <td><%= pet.name %></td>
          <td><%= pet.leg_count %></td>
        </tr>
      <% end -%>
      </table>
    <% end -%>
    <% if person.has_plants? -%>
      Plants
      <table border="1">
        <tr>
          <td>id</td>
          <td>kind</td>
          <td>qty</td>
        </tr>
      <% person.plants.each do |plant| -%>
        <tr>
          <td><%= plant.id %></td>
          <td><%= plant.kind %></td>
          <td><%= plant.qty %></td>
        </tr>
      <% end -%>
      </table>
    <% end -%>
    </td>
  </tr>
<% end -%>
<% end -%>
</table>
于 2010-09-15T14:28:58.407 に答える
2

ActiveScaffold 内で機能するソリューションを次に示します。

app/controllers/people_controller.rb

class PeopleController < ApplicationController
  active_scaffold :person do |config|
    config.label = "Report of people and other living creatures"
    config.actions.exclude :show, :delete, :edit
    # this sets up clickable links for pets and plants.
    # clicking either link will expand BOTH child object collections.
    config.columns[:pets].set_link('nested', :parameters => {:associations => "pets plants"})
    config.columns[:plants].set_link('nested', :parameters => {:associations => "pets plants"})

    #    uncomment these if you want to allow editing of pets and plants
    #    config.nested.add_link("Person's pets", [:pets])
    #    config.nested.add_link("Person's plants", [:plants])
  end
end

子テーブルが折りたたまれた状態でレポートが開くので、protolicious の event.simulate.js使用して展開する必要があります。

protolicious をダウンロードして、event.simulate.js を public/javascripts ディレクトリにコピーします。

レイアウトに event.simulate.js を含めます。

<%= javascript_include_tag :defaults %>
<%= javascript_include_tag "event.simulate.js" %>
<%= active_scaffold_includes %>

そして、このスクリプト タグをビューの一番下に追加します。

<script type="text/javascript">
  // iterates through each ActiveScaffold nested item link and clicks it
  $$('a.nested').each(function(link, index) {
    link.simulate('click');
  });
</script>

次のモデルが与えられた場合

アプリ/モデル/person.rb

class Person < ActiveRecord::Base
  has_many :pets
  has_many :plants
end

アプリ/モデル/pet.rb

class Pet < ActiveRecord::Base
  belongs_to :person
end

アプリ/モデル/plant.rb

class Plant < ActiveRecord::Base
  belongs_to :person
end
于 2010-09-19T15:47:16.770 に答える