указать столбцы из множества через ассоциацию Rails - PullRequest
0 голосов
/ 21 марта 2011

У меня есть три модели.

User
has_many :boards through => :celebrations
has_many   :celebrations, :dependent => :destroy

Board
has_many   :celebrations, :dependent => :destroy
has_many  :users, :through => :celebrations do
           def by_role(role) 
           find(:all, :conditions => ["celebrations.role = ?", role])
           end
           end

Celebration
:belongs_to :user
:belongs_to :board

Стол торжеств

   create_table :celebrations do |t|
      t.column :board_id,        :int, :null => false
      t.column :user_id,         :int, :null => false 
      t.column :role,            :string,  :null => false
      t.column :token,           :string
      t.column :accepted,    :boolean, :default => false
      t.timestamps

В контроллере:

  @board = Board.find(session[:board_id])
    @friends = @board.users.by_role("FRIEND")

В виде:

<% for friend in @friends do %>
<%= friend.name %>
<%= friend.email %>

Однако, когда я делаю следующее:

<% friend.celebration.accepted %> 

Я получаю следующую ошибку:

undefined method `celebration' for #<User:0x104788c00>

Как получить доступ к столбцу «принято» в таблице торжеств, возвращенной вместес записью с использованием расширения модели "by_role (role)".

Заранее благодарю за помощь.

1 Ответ

0 голосов
/ 21 марта 2011

Вы можете загружать празднования следующим образом:

Модель платы:

Board
  has_many   :celebrations, :dependent => :destroy
  has_many  :users, :through => :celebrations do
     def by_role(role) 
       find(:all, :conditions => ["celebrations.role = ?", role], :include => :celebrations)
     end
  end

С: include у вас будет еще один хит:

Celebration Load (0.2ms) SELECT celebrations.* FROM celebrations WHERE (celebrations.user_id IN (5,6)) 

, которыйзагружает данные празднования для пользователей.Это позволит избежать в этом конкретном случае двух попаданий, которые понадобятся для извлечения празднований для каждого пользователя.Если у вас 10 пользователей, вы закончите одним попаданием вместо 10.

При активной загрузке загружаются все данные, которые вам понадобятся для циклического взаимодействия, в связи с одним запросом вместо n запросов.

проблема остается для принятых данных, потому что у вас будет массив праздников из-за отношения has_many с пользователем.

Вы можете использовать что-то вроде этого:

<% friend.celebrations.map{|celeb| celeb.accepted }.join(",") %>
...