Ruby on rails。多对多类别

时间:2016-01-29 16:27:51

标签: ruby-on-rails categories rails-i18n ransack

我正在努力选择项目中建模类别的最佳方法。

用户创建演出,每个演出可以有多种类型。 类型必须是搜索和搜索可翻译。

以下是我尝试的内容:

我已经读过actastaggableon如果搜索多个标签,那么gem和ransack并不能很好地协同工作。另外,我不需要动态创建新类型。

我在我的演出模型中尝试了<%= form.input :genre, :collection => [t('genre.alternative'), t('genre.blues') etc etc... multiple: truegenre:string属性,该属性适用于搜索,但仅限于保存它的语言。

在我的演出模型中制作流派模型并使用具有genre_id:integer属性的每个流派的ID有效,但不允许保存多个流派。

有没有办法在模型属性中添加多个ID? 是否有任何我不知道的方法?

3 个答案:

答案 0 :(得分:1)

您需要加入表,以便在Gig和Genre之间建立多对多关系。

Genre
  has_many :gig_genres
  has_many :gigs, :through => :gig_genres

Gig
  has_many :gig_genres
  has_many :genres, :through => :gig_genres

GigGenre
  belongs_to :gig
  belongs_to :genre

答案 1 :(得分:1)

由于用户有很多演出,请将has_many :gigs添加到您的用户模型,然后在您的演示模型中添加belongs_to :user。您需要为Gig表添加user_id:integer属性以建立关系。

此外,由于Gig有许多种类,因此适用相同的步骤。在您的演员模型中添加has_many :genres并在您的流派模型中添加belong_to :gig。您需要在Genre表中添加gig_id:integer才能建立此关系。

希望有所帮助

答案 2 :(得分:0)

最后,我将其他两个答案混合在一起。

Gig模型+带

的流派模型
def change
  create_table :genres_gigs, :id => false do |t|
    t.integer :genre_id
    t.integer :gig_id
  end
end

迁移。

我使用此页面作为指南,这也有助于视图和控制器。 http://habtmexample.herokuapp.com/instructions