Rails has_many найти связанные элементы - PullRequest
1 голос
/ 21 марта 2011

Итак, получили 2 модели:

class Match < ActiveRecord::Base
  has_many :rounds
  has_many :participations
  has_many :players, :through => :participations
  belongs_to :clan_1, :class_name => "Clan", :foreign_key => "clan_1_id"
  belongs_to :clan_2, :class_name => "Clan", :foreign_key => "clan_2_id"
  belongs_to :winner, :class_name => "Clan", :foreign_key => "winner_id"
  belongs_to :league
  belongs_to :tournament

  validates :clan_1_id, :presence => true
  validates :clan_2_id, :presence => true

  scope :by_league, lambda { |league| where("league_id == ?",league.id) }
  scope :by_tournament, lambda { |tournament| where("tournament_id == ?",tournament.id) }
  scope :played, where("played is not NULL")
  scope :not_played, where("played is NULL")


end


class Clan < ActiveRecord::Base
  has_many :players
  has_many :rounds_won, :class_name => "Round", :foreign_key => "winner_id"
  has_many :rounds_blue, :class_name => "Round", :foreign_key => "clan_blue_id"
  has_many :rounds_purple, :class_name => "Round", :foreign_key => "clan_purple_id"
  has_many :matches_won, :class_name => "Match", :foreign_key => "winner_id"
  has_and_belongs_to_many :leagues
  has_and_belongs_to_many :tournaments


  def matches
    Match.where("clan_1_id = ? OR clan_2_id = ?",self.id, self.id)
  end

  def matches_lost
    matches.where("winner_id != ?", self.id)
  end

  def matches_drawn
    matches.played.where("winner_id is NULL")
  end

end

и я хочу получить все кланы, которые принимали участие в матче.

Ответы [ 3 ]

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

Ты слишком много думаешь об этом. Rails позволяет вам сделать это очень просто.

class Comment < ActiveRecord::Base
  belongs_to :post
end

class Post < ActiveRecord::Base
  has_many :comments
end

@post.comments

Если в вашей таблице комментариев есть столбец с рельсами "modelName" _id (например, post_id) с автоматическим подключением внешнего ключа.

Все, что вам нужно сделать, это вызвать @ model1.model2, предполагая, что @ model1 является экземпляром объекта model1.

Если вы хотите подключить запрос самостоятельно, вы можете использовать метод where ().

@comments = Comment.where(:post_id => some_id) 
2 голосов
/ 26 марта 2011

Если вы немного измените свои ассоциации, вы можете использовать include () в областях:

class Match < ActiveRecord::Base
  belongs_to :clan_1, :class_name => "Clan"
  belongs_to :clan_2, :class_name => "Clan"
end

class Clan < ActiveRecord::Base
  has_many :one_matches, :class_name => 'Match', :foreign_key => :clan_1_id
  has_many :two_matches, :class_name => 'Match', :foreign_key => :clan_2_id
end

Тогда вы можете добавить эту область:

class Clan < ActiveRecord::Base
  scope :participated_in_match, includes(:one_matches, :two_matches).where("matches.id IS NOT NULL")
end

Это не проверено, поэтому, пожалуйста, дайте мне знать, если вы получите неожиданные результаты.

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

Очень просто:

model_two_object = Model_2.first  # For clarity only, change to suit your needs
model_two_object.models_1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...