Tag: has and belongs to many

ActiveRecord无法更新HABTM关系

我使用一个简单的模型进行用户授权,使用两个ActiveRecords User和Role User和Role彼此之间具有HABTM关系。 我尝试创建一个用户界面,通过简单的复选框为用户分配角色 – 就像在Railscasts第17集中一样。 我的问题是User#new和User#update_attributes都不使用我的表单提交的参数来更新User对象及其角色之间的关系。 params[:user][:role_ids]包含正确的值。 但是在User.new(params[:user])或@user.update_attributes(params[:user])之后User.new(params[:user])调用@user.roles返回一个空数组。 使用@user.roles或@user.role_ids手动分配角色,但不是User#new或User#update_attributes的“魔术” 。 有任何想法吗?

使用Has And Belongs To Many关联两个已存在的对象

我正在使用Rails中的应用程序来展示动漫,这些动画已经并且属于许多语言,所以我建立了一个HABTM协会: class Anime < ActiveRecord::Base has_and_belongs_to_many :languages end class Language < ActiveRecord::Base has_and_belongs_to_many :animes end 现在我不知道如何在它们之间建立关联,我创建了许多语言记录来使用它们,例如,ID为1的语言为英语,ID为2的语言为西class牙语等…我想要只是在动画和语言之间建立联系,也就是说,如果我想说ID为1的动漫只有西class牙语,那么在表格中animes_languages我想创建值为anime_id: 1和language_id: 2的记录language_id: 2 ,仅此而已,但我相信如果我执行命令Anime.find(1).languages.create它将不会使用已有的语言,它将创建一种新语言,但我唯一想做的就是建立关联在现有动画与现有语言之间,所以,我该怎么做? 我应该为表animes_language制作一个模型吗? 这对我来说很困惑,因为当我在这里指定创建该表时,在这里输入链接描述 ,我创建了没有ID的表,它只有字段anime_id和language_id 。

validationhabtm关联的长度而不保存

我有一个与组有HABTM关系的用户模型。 我不希望用户能够在5个以上的组中,因此想要validationHABTM关系的长度。 在编辑用户页面上,我有一个复选框列表,用户可以在其中选择他们想要的组(我正在使用formtastic作为表单)。 在我的用户控制器中我打电话: @user.update_attributes(params[:user]) 这导致rails自动更新关联。 在我的用户模型中,我有以下内容: def validate if self.groups.length > 5 self.errors.add(:groups, “cannot have more than 5 groups”) end end 这导致表单validation失败,但update_attributes调用已更新数据库以反映对关联组的更改。 这样,每次用户单击“保存”按钮时,即使记录无效,也会保存其组关联。 解决这个问题的最佳方法是什么? 我想也许validation需要在组模型而不是用户模型上,这会起作用吗? 理想情况下,我想更新关联的组而不保存记录,进行validation,然后保存记录。

在Rails中创建大规模HABTM关联的最快方法是什么?

我有两个表,在Rails中有HABTM关系。 类似于以下内容: class Foo < ActiveRecord::Base has_and_belongs_to_many :bars end class Bar < ActiveRecord::Base has_and_belongs_to_many :foos end 现在我有了一个新的Foo对象,并希望为它预先加载数千个条形码,我已预先加载: @foo = Foo.create @bars = Bar.find_all_by_some_attribute(:a) @foo = Foo.create @bars = Bar.find_all_by_some_attribute(:a) 最快的方法是什么? 我试过了: @foo.bars = @bars @foo.bars << @bars 两者都运行得很慢,每个bar都有如下条目: bars_foos列(1.1ms)显示来自bars_foos SQL(0.6ms)INSERT INTO bars_foos ( bar_id , foo_id )VALUES( foo_id ) 我查看了ar-extensions,但是如果没有一个模型(Model.import)排除了它用于连接表, import函数似乎不起作用。 我需要编写SQL,还是Rails有更漂亮的方式?

HABTM关系查找所有记录,不包括基于关联的记录

我看过一些与此相关的类似SOpost,但我很难理解它。 我在项目和用户之间有一种关系。 我试图找到特定用户不属于的所有项目,但我不知道如何。 我尝试过这样的事情: Project.where(‘project_id != ?’, user.id) 但这显然也是错的。 我正在使用rails 3.2.x. 许多与此相关的答案都提到了范围,但我之前没有遇到过它们(我还是Rails的新手)。 我刚发现这篇文章有一个答案暗示: Project.where(‘id not in (?)’, user.projects) 这似乎有效,除非user.projects为空。 我正在尝试Project.where(‘id not in (?)’, (d.projects.empty? ? ”, d.projects))正如JosephCastro的回答评论post中所建议的那样,但它给了我一个语法错误第二个d.projects 。 编辑 与用户相关的项目模型代码段 class Project :validates_unique 然后 class User < ActiveRecord::Base attr_accessible … has_and_belongs_to_many :projects

Rails:HABTM – 查找没有关联的所有记录

我有2个模型(Workout,Equipment)中有一个属于很多关系。 如果我使用Workout.find(:all, :joins => :equipment, :conditions => “equipment.id = 5”)它可以工作,但如果我使用Workout.find(:all, :joins => :equipment, :conditions => “equipment.id = null”)它不返回没有关联的记录。 有任何想法吗?

使用HABTM关系更新复选框的值 – Rails

嘿伙计们我一直在使用与Railscast第17集中的复选框示例的has_and_belongs_to_many关系。 我有一些问题,现在一切都很顺利,除了更新按钮不起作用。 编辑视图看起来像这样 ‘update’ do |f| %> 在我的控制器…. def edit @user = User.find(session[:user_id]) end def update params[:user][:interest_ids] ||= [] @user = User.find(session[:user_id]) if @user.update_attributes(params[:user]) flash[:notice]=’User data was updated’ redirect_to :action => ‘index’ else redirect_to :action => ‘index’ end end 按钮不是重定向的事件……所以我不知道发生了什么。 我的表单创作中有什么东西弄乱了吗? 我不确定如何创建一个按钮,让它访问控制器中的方法,模型更新等。 我环顾四周寻求帮助,想到也许是因为attr_accessible所以我添加了=> attr_accessible :login, :email, :password, :password_confirmation, :interest_ids, :user 到我的用户模型但仍然没有…我知道为什么我的表单没有提交?

有和属于许多错误 – * _development.hunts_tasks’不存在:

所以我正在开展一个项目,其中有一些任务组成了寻宝者。 因此,当用户点击特定的搜索时,我希望show.html.erb文件显示搜索以及与该搜索相关的任务。 两个模型(Hunt.rb和Task.rb)彼此之间具有“has_and_belongs_to_many”关系。 我的控制器最初有这个代码,但它显示了数据库中的每个任务,而不仅仅是与特定搜索相关的任务。 def show @hunt = Hunt.find(params[:id]) @title = @hunt.name @tasks = Task.paginate(:page => params[:page]) end 所以我尝试了这个。 def show @hunt = Hunt.find(params[:id]) @title = @hunt.name @tasks = @hunt.tasks.paginate(:page => params[:page]) end 但后来它抛出了这个错误: ActiveRecord::StatementInvalid in Hunts#show Showing /****/views/hunts/show.html.erb where line #10 raised: Mysql2::Error: Table ‘***_development.hunts_tasks’ doesn’t exist: SELECT `tasks`.* FROM `tasks` INNER JOIN `hunts_tasks` […]

to_xml不适用于通过Rails返回的对象ActiveRecord habtm参考

我有两个rails活动记录类,School和Instructor通过has_and_belongs_to_many关系链接。 我需要查询我的instructors_controller以获取特定学校的教师并返回xml格式的响应。 因此,在索引方法中我有这个代码片段: school = School.find(params[:school_id]) @instructors = school.instructors 然后: respond_to do |format| format.html # index.html.erb format.xml { render :xml => @instructors } format.json { render :json => @instructors } end 但它不起作用。 看看这个有趣但令人困惑的序列: ruby-1.9.2-p180 :023 > Instructor.all.first => # ruby-1.9.2-p180 :026 > Instructor.all.first.class => Instructor(id: integer, name: string, instructor_type_id: integer, created_at: datetime, updated_at: datetime) ruby-1.9.2-p180 […]

HABTM mongoid追随者/追随者

Mongoid在一个habtm上发布了.push,它在两个方向上建立了一个habtm关系。 虽然删除将#delete一个关联的记录,但没有记录的方法只删除我见过的关系。 有更好的方法吗? 有没有更好的方法来确保独特性? has_and_belongs_to_many :following, {class_name: ‘User’, inverse_of: :followers, inverse_class_name: ‘User’} has_and_belongs_to_many :followers, {class_name: ‘User’, inverse_of: :following, inverse_class_name: ‘User’} def follow!(user) self.following.push(user) # this pushes the inverse as well self.following_ids.uniq! self.save! user.follower_ids.uniq! user.save! end def unfollow!(user) self.following.delete(user.id) self.save! user.followers.delete(self.id) user.save! end