Беда с `has_many через:` отношения - PullRequest
0 голосов
/ 03 января 2019

Я настраиваю модель пользователя, веб-сайта и тега, но не уверен в правильности ассоциаций?

Это приложение CRUD, в котором я хочу позволить Пользователю создать «веб-сайт» (по сути, закладку) и иметь возможность добавить «тег» к этому веб-сайту, чтобы веб-сайты могли быть отфильтрованы.

У меня есть три таблицы: User, Website, Tag

Я хочу, чтобы у пользователя было много веб-сайтов, на сайте много тегов, теги принадлежат сайту, а у пользователя много тегов на сайтах.

У меня уже установлены следующие модели:

class User < ActiveRecord::Base
  has_many :websites
  has_many :tags, through: :websites
end

class Website < ActiveRecord::Base
  belongs_to :user
  has_many :tags
end

class Tag < ActiveRecord::Base
  belongs_to :website
end

Я сохраняю тег с помощью почтового запроса:

post '/websites' do
  if logged_in?
    if params[:content] == ""
      redirect to "/websites/new"
    else
      @website = current_user.websites.build(content: params[:content])
      binding.pry
      @tag = current_user.tags.build(content: params[:dropdown])
      if @website.save && @tag.save
        redirect to "/websites/#{@website.id}"
      else
        redirect to "/websites/new"
      end
    end
  else
    redirect to '/login'
  end
end

Когда я проверяю params на binding.pry, это дает мне, как и ожидалось:

{content=>"tryingtoaddtag.com", "dropdown"=>"Clothing"}

Я ожидаю, что смогу сохранить экземпляр пользователя и затем использовать @user.tags, чтобы показать все теги, связанные с веб-сайтами этого пользователя. Я не могу понять, где я облажался. Спасибо.

Ответы [ 3 ]

0 голосов
/ 03 января 2019

Рассмотрим сайт has_many: теги

class User < ActiveRecord::Base
  has_many :websites

  def user_tags
    Tag.joins(:website).where(websites: {user_id:  self.id})
  end

end

class Website < ActiveRecord::Base
  belongs_to :user
  has_many :tags
end

class Tag < ActiveRecord::Base
  belongs_to :website
end

Запрос -

user = User.first
user.user_tags
0 голосов
/ 03 января 2019

Попробуйте следующее,

class User < ActiveRecord::Base
  has_many :websites 
end

class Website < ActiveRecord::Base
  belongs_to :user
  has_many :tags
end

class Tag < ActiveRecord::Base
  belongs_to :website
  scope :user_tags, ->(user) { joins(:website).where(websites: {user_id:  user}) }
end

Запрос будет выглядеть, (для @user объекта)

Tag.user_tags(@user)
0 голосов
/ 03 января 2019

Прочтите это Статья и попробуйте это:

class Tag < ActiveRecord::Base
  belongs_to :website
  delegate :user, :to => :website, :allow_nil => true
end

Если это не сработает.Используйте область действия в User модели с

def tags
 Tags.where(website_id: self.websites.pluck(:id))
end
...