Есть ли способ использовать AREL для пользовательских ассоциаций? - PullRequest
4 голосов
/ 26 апреля 2011
model Post
  # ActiveRecord associations have tons of options that let
  # you do just about anything like:
  has_many :comments
  has_many :spam_comments, :conditions => ['spammy = ?', true]

  # In Rails 3, named scopes are ultra-elegant, and let you do things like:
  scope :with_comments, joins(:comments)
end

Есть ли способ использовать AREL или другой более простой синтаксис для определения пользовательских ассоциаций так же элегантно, как и для именованных областей?

обновление

Я решил, что в любом случае не стоит помещать подобные детали в ассоциации, потому что ассоциации всегда / в основном должны определять основные отношения между моделями.

Ответы [ 2 ]

3 голосов
/ 26 апреля 2011

Одним из решений является наложение спама на Комментарии:

model Post
  has_many :comments

  scope :with_comments, joins(:comments)
end

model Comment
  scope :spammy, where(:spammy => true)
end

Это выглядит немного чище в отношении обязанностей модели.С точки зрения производительности это точно так же:

p.comments.spammy.to_sql
# → SELECT "comments".* FROM "comments"
#   WHERE ("comments".post_id = 2) AND ("comments"."spammy" = "t")

Дополнительное преимущество: вы можете получать спам-комментарии от любых других ассоциаций.

2 голосов
/ 26 апреля 2011

Ну, может быть, есть лучший способ, но я знаю, что вы можете использовать фактические Арель условия (в отличие от ActiveRecord :: Relation s) в ассоциациях с использованием Ареля to_sql функция.

has_many :spam_comments, :class_name => 'Comment', :conditions => Comment.arel_table[:spammy].eq(true).to_sql

Вы заметите, что реальный код Arel не такой скудный, как отношения ActiveRecord.

Я нашел комментарий в главной ветке Rails, который ссылался на передачу предиката Arel как условие, но этот код, похоже, отсутствует в ветке 3.0. По крайней мере, не то, что я мог найти.

...