рельсы, как добавить в: включить для многократного индекса ключа связи - PullRequest
0 голосов
/ 01 августа 2011

Я начал с того, что следовал этому руководству здесь Rails - многократное сопоставление индексных ключей

Я попытался добавить: включить, чтобы ускорить сопоставление, но я получаю эту ошибку:

ActiveRecord::StatementInvalid in ItemsController#show

SQLite3::SQLException: no such column: links.item_id: SELECT "links".* FROM "links" WHERE ("links".item_id = 19)

вот что у меня есть:

item.rb

 class Item < ActiveRecord::Base
    has_many :links, :dependent => :destroy, :uniq => true
    belongs_to :category
    belongs_to :user

    is_sluggable :name

     def links
      Link.by_item(self)
     end

link.rb

class Link < ActiveRecord::Base
  belongs_to :item1, :class_name => 'Item', :foreign_key => :item1_id
  belongs_to :item2, :class_name => 'Item', :foreign_key => :item2_id
  belongs_to :user
  validates_presence_of :item1_id
  validates_presence_of :item2_id
  validates_uniqueness_of :item1_id, :scope => :item2_id, :message => "This combination already exists!"

  def self.by_item(item)
    where("item1_id = :item_id OR item2_id = :item_id", :item_id => item.id)
  end
end

items_controller.rb

  def show
    @item = Item.find_using_slug(params[:id], :include => [:category, :user, :links])

Работает нормально без: ссылки внутри: включают.Но в противном случае я получаю ошибку.

Насколько я понимаю, item_id хранится в таблице ссылок как item1_id или item2_id, поэтому его нельзя найти.Есть ли обходной путь для этого, потому что я буду активно ссылаться на записи ссылок.Я не очень хорошо разбираюсь в SQL.

Также не уверен, каков наилучший способ настроить индекс

Готов попробовать любой совет.Спасибо

1 Ответ

0 голосов
/ 01 августа 2011

Проблема заключается в настройке ассоциации has_many :links в Item.По умолчанию это преобразуется в запрос SQL, который ищет все ссылки, которые имеют item_id текущего Item.Чтобы переопределить это поведение по умолчанию, задайте сам поиск SQL следующим образом:

has_many :links, :dependent => :destroy, :uniq => true, :finder_sql => 'SELECT DISTINCT(*) FROM links WHERE item1_id = #{id} OR item2_id = #{id}'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...