ruby-on-rails-3 - 在关联上使用作用域

标签 ruby-on-rails-3 activerecord arel

所以我有了一个疯狂的想法,我想将范围应用于包含的关联。这是我想出来的,它似乎工作得很好:

class Event < ActiveRecord::Base
  has_many :races
  has_many :bad_races, :conditions => Race.bad_medals_sql, :class_name => "Race"
end

class Race < ActiveRecord::Base
  def self.bad_medals_sql
    arel_table[:prizes].eq('medals').to_sql
    # This returns a string
    # "`races`.`prizes` = 'medals'"
  end

  def self.bad_medals
    where(bad_medals_sql)
  end
end

Event.includes(:bad_races)
Reloading...
  Event Load (0.4ms)  SELECT `events`.* FROM `events`
  Race Load (0.5ms)  SELECT `races`.* FROM `races` WHERE (`races`.event_id IN (1,2,3,4) AND (`races`.`prizes` = 'medals'))

问题是它真的很钝。为了在 Race 上定义范围(在其他地方使用)并在 Event 的关联上使用它,我必须在 Race 上有两种方法。对于每个范围。

我确信我可以将模式包装到插件或类似插件中,但如果可能的话,我更愿意使用原生 AR/ARel。这样做的任何想法?

最佳答案

这段代码看起来过于复杂。假设您的目标是获得包含只有“奖牌”作为奖品的比赛的所有赛事,这不是一个简单的 scope工作?

class Event < ActiveRecord::Base
  has_many :races
  scope :bad_races, includes(:races).where("races.prizes=?", "medals")
end

class Race < ActiveRecord::Base
  belongs_to :event
end

然后你可以运行 Event.bad_races获得糟糕的比赛。

关于ruby-on-rails-3 - 在关联上使用作用域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4859099/

相关文章:

ruby-on-rails - Rails 3.0 引擎 - 在 ActionController 中执行代码

ruby-on-rails - rails : How to make a form post to another controller action

sql - 在加入时用 Arel 连接变量和字符串

ruby-on-rails - Rails 3从联接返回所有列

ruby-on-rails - 更新 rails 中的记录后获得 RETURNING

ruby-on-rails - 获取完整的 Rails Controller 名称,包括命名空间

javascript - Rails 3 中的 link_to a Devise 方法不会产生任何结果

ruby-on-rails - 来自单个 Rails 应用程序的多个数据库 : what's the state-of-the-art?

sql - 此 sql 的 Rails 事件记录转换

php - 幕后 : How does an ORM "think"?