开发者

Rails has_many find associated items

So, got 2 models:

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", :f开发者_如何学运维oreign_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

and I want to fetch all clans, which taken part in match.


You're over thinking it. Rails makes it very easy for you to do this.

class Comment < ActiveRecord::Base
  belongs_to :post
end

class Post < ActiveRecord::Base
  has_many :comments
end

@post.comments

If you have a column in your comment table with "modelName"_id (eg post_id) rails with automatically hook up the foreign key.

All you have to do is call @model1.model2 assuming @model1 is an instance of the model1 object.

If you want to hook up the query yourself you could use the where() method.

@comments = Comment.where(:post_id => some_id) 


If you alter your associations a little bit you can utilize includes() in scopes:

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

Then you can add this scope:

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

This isn't tested so please let me know if you get unexpected results.


Quite simply:

model_two_object = Model_2.first  # For clarity only, change to suit your needs
model_two_object.models_1
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜