has_one для принадлежащего в Rails? - PullRequest
2 голосов
/ 07 мая 2009

Я строю участок рельсов и у меня проблемы с ассоциациями. В основном у меня есть следующее:

class Publication < ActiveRecord::Base
  belongs_to :category
  has_one    :site, :through => :category
  named_scope :on_site,        lambda {|s| {:include => [:site], :conditions => ['sites.slug != ?', 's']}}
end
class Category
  belongs_to :site
  has_many   :publications
end
class Site
  has_many :categories
  has_many :publications, :through => :categories, :foreign_key => 'category_id'
end

Publication.first.site создает сайт первой публикации, site.first.publications также.

Проблема в именованной области действия on_site, которая выдает следующую ошибку с чем-то вроде Publication.on_site('s')

Mysql::Error: Unknown column 'categories.category_id' in 'on clause': SELECT 
`publications`.`id` AS t0_r0, `publications`.`shoot_id` AS t0_r1, 
`publications`.`category_id` AS t0_r2, `publications`.`title` AS t0_r3, 
`publications`.`slug` AS t0_r4, `publications`.`publish_on` AS t0_r5, 
`publications`.`created_at` AS t0_r6, `publications`.`updated_at` AS t0_r7, 
`publications`.`description` AS t0_r8, `publications`.`media_base_path` AS t0_r9, 
`sites`.`id` AS t1_r0, `sites`.`name` AS t1_r1, `sites`.`created_at` AS t1_r2, 
`sites`.`updated_at` AS t1_r3, `sites`.`slug` AS t1_r4, `sites`.`description` AS t1_r5, 
`sites`.`dhd_merch_id` AS t1_r6, `sites`.`members_area_url` AS t1_r7 FROM `publications`
 LEFT OUTER JOIN `categories` ON (`publications`.`id` = `categories`.`category_id`)  
 LEFT OUTER JOIN `sites` ON (`sites`.`id` = `categories`.`site_id`) WHERE (sites.slug != 's')

Мне нужно, чтобы это объединение было публикациями.category_id = Categories.id, есть идеи, в чем я ошибся?

Ответы [ 2 ]

2 голосов
/ 17 мая 2009

Ну, вот проблема с вашей текущей реализацией:

LEFT OUTER JOIN `categories` ON (`publications`.`id` = `categories`.`category_id`)

Этот фрагмент SQL создан с помощью этого определения ассоциации в Site:

has_many :publications, :through => :categories, :foreign_key => 'category_id'

Неверно foreign_key. Rails ищет столбец в categories с именем category_id и ожидает, что значение этого столбца будет соответствовать некоторому идентификатору публикации. Но нет правильной опции foreign_key, которую вы можете установить, потому что таблица categories выглядит так, как будто у нее нет ссылок на таблицу publications, а наоборот.

Я не уверен, что можно заставить has_many :through ассоциацию ActiveRecord работать через промежуточную has_many ассоциацию. Но я думаю, что вы можете использовать функцию вложенной ассоциации, чтобы сделать эту работу:

class Publication < ActiveRecord::Base
  belongs_to :category
  #has_one    :site, :through => :category
  named_scope :on_site,        lambda {|s| {:include => { :category => :site }, :conditions =>  ['sites.slug != ?', s]}}
end

Другая проблема заключается в том, что вы помещаете s в кавычки в массиве условий. Не должно быть в кавычках.

1 голос
/ 07 мая 2009

Ну, я нашел решение, используя опцию :joins для области, если кому-то интересно. Я все еще хотел бы знать, возможно ли это без использования :joins.

  named_scope :on_site,        lambda {|s| {:joins =>
   ['LEFT OUTER JOIN `categories` ON  (`publications`.`category_id` = `categories`.`id`) ',
   'LEFT OUTER JOIN `sites`      ON  (`sites`.`id` = `categories`.`site_id`)'],
   :conditions => ['sites.slug = ?', s]}}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...