麻烦“ has_many通过:”关系

时间:2019-01-03 12:20:35

标签: ruby-on-rails ruby activerecord sinatra sinatra-activerecord

我正在建立用户,网站和标签模型,但是不确定正确的关联吗?

这是一个CRUD应用程序,我要允许用户创建“网站”(本质上是书签),并能够向该网站添加“标签”,以便可以过滤网站。

我有三个表:UnmarshalExceptionUserWebsite

我希望用户拥有多个网站,网站具有多个标签,标签属于网站,并且用户通过网站具有多个标签。

我已经设置了以下模型:

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"} 显示与该用户的网站关联的所有标签。我不太清楚自己在搞砸。谢谢。

3 个答案:

答案 0 :(得分:1)

阅读此Article,然后尝试以下操作:

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

答案 1 :(得分:1)

考虑一个网站has_many:tags

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

答案 2 :(得分:1)

尝试以下操作,

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)